1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file teximage.c
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texture image-related functions.
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdbool.h>
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "bufferobj.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "context.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enums.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "fbobject.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "framebuffer.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "hash.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "image.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "macros.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mfeatures.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_cpal.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "teximage.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texobj.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texstate.h"
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glformats.h"
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Inexplicably, GL_HALF_FLOAT_OES has a different value than GL_HALF_FLOAT.
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef GL_HALF_FLOAT_OES
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GL_HALF_FLOAT_OES 0x8D61
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * State changes which we care about for glCopyTex[Sub]Image() calls.
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In particular, we care about pixel transfer state and buffer state
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (such as glReadBuffer to make sure we read from the right renderbuffer).
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NEW_COPY_TEX_STATE (_NEW_BUFFERS | _NEW_PIXEL)
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the simple base format for a given internal texture format.
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For example, given GL_LUMINANCE12_ALPHA4, return GL_LUMINANCE_ALPHA.
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param internalFormat the internal texture format token or 1, 2, 3, or 4.
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return the corresponding \u base internal format (GL_ALPHA, GL_LUMINANCE,
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA), or -1 if invalid enum.
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the format which is used during texture application (i.e. the
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture format and env mode determine the arithmetic used.
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (internalFormat) {
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA:
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA4:
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA8:
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA12:
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA16:
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE:
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE4:
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8:
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE12:
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16:
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA:
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE4_ALPHA4:
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE6_ALPHA2:
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8_ALPHA8:
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE12_ALPHA4:
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE12_ALPHA12:
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16_ALPHA16:
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY:
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY4:
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY8:
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY12:
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY16:
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return (ctx->API != API_OPENGL_CORE) ? GL_RGB : -1;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB:
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R3_G3_B2:
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB4:
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB5:
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB8:
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB10:
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB12:
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB16:
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RGB;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return (ctx->API != API_OPENGL_CORE) ? GL_RGBA : -1;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA:
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA2:
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA4:
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB5_A1:
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA8:
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB10_A2:
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA12:
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA16:
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RGBA;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0).
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_gles(ctx)) {
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_BGRA:
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGBA;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_ES2_compatibility) {
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB565:
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGB;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_depth_texture) {
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH_COMPONENT:
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH_COMPONENT16:
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH_COMPONENT24:
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH_COMPONENT32:
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_DEPTH_COMPONENT;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (internalFormat) {
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_ALPHA:
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_ALPHA;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_LUMINANCE:
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_LUMINANCE;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_LUMINANCE_ALPHA:
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_LUMINANCE_ALPHA;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_INTENSITY:
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INTENSITY;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RGB:
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RGB;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RGBA:
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RGBA;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ; /* fallthrough */
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.TDFX_texture_compression_FXT1) {
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGB_FXT1_3DFX:
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGB;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGBA_FXT1_3DFX:
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGBA;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_compression_s3tc) {
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGB;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGBA;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.S3_s3tc) {
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB_S3TC:
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB4_S3TC:
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGB;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA_S3TC:
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA4_S3TC:
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGBA;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.MESA_ycbcr_texture) {
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (internalFormat == GL_YCBCR_MESA)
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_YCBCR_MESA;
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_texture_float) {
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_ALPHA16F_ARB:
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_ALPHA32F_ARB:
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_ALPHA;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA16F_ARB:
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA32F_ARB:
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGBA;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB16F_ARB:
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB32F_ARB:
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGB;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_INTENSITY16F_ARB:
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_INTENSITY32F_ARB:
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_INTENSITY;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE16F_ARB:
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE32F_ARB:
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_LUMINANCE;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE_ALPHA16F_ARB:
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE_ALPHA32F_ARB:
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_LUMINANCE_ALPHA;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ATI_envmap_bumpmap) {
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DUDV_ATI:
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DU8DV8_ATI:
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_DUDV_ATI;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_snorm) {
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RED_SNORM:
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_R8_SNORM:
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_R16_SNORM:
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RED;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RG_SNORM:
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RG8_SNORM:
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RG16_SNORM:
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RG;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB_SNORM:
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB8_SNORM:
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB16_SNORM:
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGB;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA_SNORM:
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA8_SNORM:
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA16_SNORM:
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_RGBA;
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_ALPHA_SNORM:
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_ALPHA8_SNORM:
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_ALPHA16_SNORM:
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_ALPHA;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE_SNORM:
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE8_SNORM:
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE16_SNORM:
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_LUMINANCE;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE_ALPHA_SNORM:
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE8_ALPHA8_SNORM:
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE16_ALPHA16_SNORM:
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_LUMINANCE_ALPHA;
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_INTENSITY_SNORM:
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_INTENSITY8_SNORM:
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_INTENSITY16_SNORM:
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_INTENSITY;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_packed_depth_stencil) {
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH_STENCIL_EXT:
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH24_STENCIL8_EXT:
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_DEPTH_STENCIL_EXT;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_EXT_texture_sRGB
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_sRGB) {
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SRGB_EXT:
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SRGB8_EXT:
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_EXT:
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RGB;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SRGB_ALPHA_EXT:
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SRGB8_ALPHA8_EXT:
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_ALPHA_EXT:
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RGBA;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SLUMINANCE_ALPHA_EXT:
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SLUMINANCE8_ALPHA8_EXT:
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_LUMINANCE_ALPHA;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SLUMINANCE_EXT:
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SLUMINANCE8_EXT:
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SLUMINANCE_EXT:
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_LUMINANCE;
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* FEATURE_EXT_texture_sRGB */
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Version >= 30 ||
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Extensions.EXT_texture_integer) {
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA8UI_EXT:
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA16UI_EXT:
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA32UI_EXT:
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA8I_EXT:
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA16I_EXT:
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA32I_EXT:
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB10_A2UI:
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RGBA;
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB8UI_EXT:
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB16UI_EXT:
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB32UI_EXT:
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB8I_EXT:
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB16I_EXT:
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB32I_EXT:
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RGB;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_integer) {
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA8UI_EXT:
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA16UI_EXT:
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA32UI_EXT:
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA8I_EXT:
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA16I_EXT:
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA32I_EXT:
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_ALPHA;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY8UI_EXT:
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY16UI_EXT:
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY32UI_EXT:
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY8I_EXT:
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY16I_EXT:
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY32I_EXT:
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_INTENSITY;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8UI_EXT:
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16UI_EXT:
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE32UI_EXT:
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8I_EXT:
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16I_EXT:
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE32I_EXT:
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_LUMINANCE;
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA8UI_EXT:
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA16UI_EXT:
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA32UI_EXT:
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA8I_EXT:
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA16I_EXT:
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA32I_EXT:
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_LUMINANCE_ALPHA;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_texture_rg) {
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16F:
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* R16F depends on both ARB_half_float_pixel and ARB_texture_float.
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (!ctx->Extensions.ARB_half_float_pixel)
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* FALLTHROUGH */
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R32F:
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (!ctx->Extensions.ARB_texture_float)
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RED;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R8I:
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R8UI:
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16I:
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16UI:
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R32I:
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R32UI:
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (ctx->Version < 30 && !ctx->Extensions.EXT_texture_integer)
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* FALLTHROUGH */
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R8:
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16:
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RED:
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RED:
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RED;
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16F:
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* RG16F depends on both ARB_half_float_pixel and ARB_texture_float.
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (!ctx->Extensions.ARB_half_float_pixel)
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* FALLTHROUGH */
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG32F:
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (!ctx->Extensions.ARB_texture_float)
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RG;
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG8I:
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG8UI:
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16I:
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16UI:
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG32I:
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG32UI:
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (ctx->Version < 30 && !ctx->Extensions.EXT_texture_integer)
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* FALLTHROUGH */
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG:
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG8:
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16:
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RG:
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RG;
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_shared_exponent) {
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB9_E5_EXT:
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RGB;
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_packed_float) {
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R11F_G11F_B10F_EXT:
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RGB;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_depth_buffer_float) {
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT32F:
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_DEPTH_COMPONENT;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH32F_STENCIL8:
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_DEPTH_STENCIL;
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_texture_compression_rgtc) {
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RED_RGTC1:
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SIGNED_RED_RGTC1:
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RED;
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RG_RGTC2:
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SIGNED_RG_RGTC2:
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RG;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_compression_latc) {
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_LUMINANCE;
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_LUMINANCE_ALPHA;
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ATI_texture_compression_3dc) {
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_LUMINANCE_ALPHA;
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.OES_compressed_ETC1_RGB8_texture) {
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ETC1_RGB8_OES:
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_RGB;
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->API == API_OPENGLES) {
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE4_RGB8_OES:
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE4_R5_G6_B5_OES:
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE8_RGB8_OES:
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE8_R5_G6_B5_OES:
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_RGB;
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE4_RGBA8_OES:
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE8_RGB5_A1_OES:
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE4_RGBA4_OES:
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE4_RGB5_A1_OES:
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE8_RGBA8_OES:
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE8_RGBA4_OES:
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_RGBA;
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return -1; /* error */
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For cube map faces, return a face index in [0,5].
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For other targets return 0;
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLuint
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_tex_target_to_face(GLenum target)
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_cube_face(target))
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Install gl_texture_image in a gl_texture_object according to the target
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and level parameters.
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param tObj texture object.
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target.
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level.
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texImage texture image.
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_tex_image(struct gl_texture_object *tObj,
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              GLenum target, GLint level,
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct gl_texture_image *texImage)
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint face = _mesa_tex_target_to_face(target);
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(tObj);
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(texImage);
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (target == GL_TEXTURE_RECTANGLE_NV || target == GL_TEXTURE_EXTERNAL_OES)
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(level == 0);
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tObj->Image[face][level] = texImage;
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Set the 'back' pointer */
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texImage->TexObject = tObj;
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texImage->Level = level;
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texImage->Face = face;
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocate a texture image structure.
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via ctx->Driver.NewTextureImage() unless overriden by a device
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * driver.
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return a pointer to gl_texture_image struct with all fields initialized to
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * zero.
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_image *
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_new_texture_image( struct gl_context *ctx )
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) ctx;
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return CALLOC_STRUCT(gl_texture_image);
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free a gl_texture_image and associated data.
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function is a fallback called via ctx->Driver.DeleteTextureImage().
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texImage texture image.
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free the texture image structure and the associated image data.
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_delete_texture_image(struct gl_context *ctx,
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           struct gl_texture_image *texImage)
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Free texImage->Data and/or any other driver-specific texture
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * image storage.
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(ctx->Driver.FreeTextureImageBuffer);
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Driver.FreeTextureImageBuffer( ctx, texImage );
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(texImage);
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if a target is a proxy target.
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target.
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if the target is a proxy target, GL_FALSE otherwise.
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_proxy_texture(GLenum target)
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * NUM_TEXTURE_TARGETS should match number of terms below, except there's no
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * proxy for GL_TEXTURE_BUFFER and GL_TEXTURE_EXTERNAL_OES.
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(NUM_TEXTURE_TARGETS == 7 + 2);
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (target == GL_PROXY_TEXTURE_1D ||
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           target == GL_PROXY_TEXTURE_2D ||
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           target == GL_PROXY_TEXTURE_3D ||
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           target == GL_PROXY_TEXTURE_CUBE_MAP_ARB ||
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           target == GL_PROXY_TEXTURE_RECTANGLE_NV ||
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           target == GL_PROXY_TEXTURE_1D_ARRAY_EXT ||
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           target == GL_PROXY_TEXTURE_2D_ARRAY_EXT);
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the proxy target which corresponds to the given texture target
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLenum
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_proxy_target(GLenum target)
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D:
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D:
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_PROXY_TEXTURE_1D;
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D:
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_PROXY_TEXTURE_2D;
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_3D:
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_PROXY_TEXTURE_3D;
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_ARB:
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_PROXY_TEXTURE_CUBE_MAP_ARB;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_RECTANGLE_NV:
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_RECTANGLE_NV:
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_PROXY_TEXTURE_RECTANGLE_NV;
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D_ARRAY_EXT:
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_PROXY_TEXTURE_1D_ARRAY_EXT;
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D_ARRAY_EXT:
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_PROXY_TEXTURE_2D_ARRAY_EXT;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(NULL, "unexpected target in _mesa_get_proxy_target()");
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the texture object that corresponds to the target of the given
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture unit.  The target should have already been checked for validity.
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texUnit texture unit.
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target.
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return pointer to the texture object on success, or NULL on failure.
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_object *
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_select_tex_object(struct gl_context *ctx,
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const struct gl_texture_unit *texUnit,
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLenum target)
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean arrayTex = (ctx->Extensions.MESA_texture_array ||
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               ctx->Extensions.EXT_texture_array);
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_1D:
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return texUnit->CurrentTex[TEXTURE_1D_INDEX];
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_1D:
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return ctx->Texture.ProxyTex[TEXTURE_1D_INDEX];
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_2D:
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return texUnit->CurrentTex[TEXTURE_2D_INDEX];
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_2D:
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return ctx->Texture.ProxyTex[TEXTURE_2D_INDEX];
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_3D:
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return texUnit->CurrentTex[TEXTURE_3D_INDEX];
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_3D:
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return ctx->Texture.ProxyTex[TEXTURE_3D_INDEX];
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_ARB:
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return ctx->Extensions.ARB_texture_cube_map
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ? texUnit->CurrentTex[TEXTURE_CUBE_INDEX] : NULL;
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return ctx->Extensions.ARB_texture_cube_map
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ? ctx->Texture.ProxyTex[TEXTURE_CUBE_INDEX] : NULL;
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_RECTANGLE_NV:
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return ctx->Extensions.NV_texture_rectangle
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ? texUnit->CurrentTex[TEXTURE_RECT_INDEX] : NULL;
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_RECTANGLE_NV:
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return ctx->Extensions.NV_texture_rectangle
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ? ctx->Texture.ProxyTex[TEXTURE_RECT_INDEX] : NULL;
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_1D_ARRAY_EXT:
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return arrayTex ? texUnit->CurrentTex[TEXTURE_1D_ARRAY_INDEX] : NULL;
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return arrayTex ? ctx->Texture.ProxyTex[TEXTURE_1D_ARRAY_INDEX] : NULL;
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_2D_ARRAY_EXT:
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return arrayTex ? texUnit->CurrentTex[TEXTURE_2D_ARRAY_INDEX] : NULL;
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return arrayTex ? ctx->Texture.ProxyTex[TEXTURE_2D_ARRAY_INDEX] : NULL;
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_BUFFER:
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return _mesa_is_desktop_gl(ctx)
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            && ctx->Extensions.ARB_texture_buffer_object
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ? texUnit->CurrentTex[TEXTURE_BUFFER_INDEX] : NULL;
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_EXTERNAL_OES:
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return ctx->Extensions.OES_EGL_image_external
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ? texUnit->CurrentTex[TEXTURE_EXTERNAL_INDEX] : NULL;
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_problem(NULL, "bad target in _mesa_select_tex_object()");
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return pointer to texture object for given target on current texture unit.
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_object *
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_current_tex_object(struct gl_context *ctx, GLenum target)
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_unit *texUnit = _mesa_get_current_tex_unit(ctx);
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return _mesa_select_tex_object(ctx, texUnit, target);
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get a texture image pointer from a texture object, given a texture
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * target and mipmap level.  The target and level parameters should
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * have already been error-checked.
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texObj texture unit.
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target.
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level.
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return pointer to the texture image structure, or NULL on failure.
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_image *
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_select_tex_image(struct gl_context *ctx,
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const struct gl_texture_object *texObj,
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       GLenum target, GLint level)
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint face = _mesa_tex_target_to_face(target);
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(texObj);
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(level >= 0);
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(level < MAX_TEXTURE_LEVELS);
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return texObj->Image[face][level];
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Like _mesa_select_tex_image() but if the image doesn't exist, allocate
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it and install it.  Only return NULL if passed a bad parameter or run
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * out of memory.
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_image *
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_tex_image(struct gl_context *ctx, struct gl_texture_object *texObj,
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    GLenum target, GLint level)
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_image *texImage;
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!texObj)
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texImage = _mesa_select_tex_image(ctx, texObj, target, level);
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!texImage) {
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texImage = ctx->Driver.NewTextureImage(ctx);
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!texImage) {
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_OUT_OF_MEMORY, "texture image allocation");
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      set_tex_image(texObj, target, level, texImage);
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return texImage;
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return pointer to the specified proxy texture image.
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that proxy textures are per-context, not per-texture unit.
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return pointer to texture image or NULL if invalid target, invalid
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         level, or out of memory.
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_texture_image *
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_proxy_tex_image(struct gl_context *ctx, GLenum target, GLint level)
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_image *texImage;
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint texIndex;
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (level < 0)
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D:
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.MaxTextureLevels)
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texIndex = TEXTURE_1D_INDEX;
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D:
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.MaxTextureLevels)
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texIndex = TEXTURE_2D_INDEX;
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_3D:
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.Max3DTextureLevels)
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texIndex = TEXTURE_3D_INDEX;
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_CUBE_MAP:
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.MaxCubeTextureLevels)
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texIndex = TEXTURE_CUBE_INDEX;
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_RECTANGLE_NV:
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level > 0)
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texIndex = TEXTURE_RECT_INDEX;
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.MaxTextureLevels)
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texIndex = TEXTURE_1D_ARRAY_INDEX;
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.MaxTextureLevels)
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texIndex = TEXTURE_2D_ARRAY_INDEX;
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texImage = ctx->Texture.ProxyTex[texIndex]->Image[0][level];
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!texImage) {
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texImage = ctx->Driver.NewTextureImage(ctx);
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!texImage) {
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_OUT_OF_MEMORY, "proxy texture allocation");
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Texture.ProxyTex[texIndex]->Image[0][level] = texImage;
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Set the 'back' pointer */
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texImage->TexObject = ctx->Texture.ProxyTex[texIndex];
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return texImage;
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the maximum number of allowed mipmap levels.
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target.
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return the maximum number of allowed mipmap levels for the given
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture target, or zero if passed a bad target.
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa gl_constants.
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_max_texture_levels(struct gl_context *ctx, GLenum target)
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D:
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D:
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D:
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ctx->Const.MaxTextureLevels;
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_3D:
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ctx->Const.Max3DTextureLevels;
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP:
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ctx->Extensions.ARB_texture_cube_map
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ? ctx->Const.MaxCubeTextureLevels : 0;
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_RECTANGLE_NV:
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_RECTANGLE_NV:
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ctx->Extensions.NV_texture_rectangle ? 1 : 0;
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D_ARRAY_EXT:
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D_ARRAY_EXT:
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (ctx->Extensions.MESA_texture_array ||
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              ctx->Extensions.EXT_texture_array)
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ? ctx->Const.MaxTextureLevels : 0;
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_BUFFER:
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_is_desktop_gl(ctx)
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         && ctx->Extensions.ARB_texture_buffer_object
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ? 1 : 0;
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_EXTERNAL_OES:
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* fall-through */
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0; /* bad target */
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return number of dimensions per mipmap level for the given texture target.
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_texture_dimensions(GLenum target)
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D:
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D:
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1;
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_RECTANGLE:
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP:
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D:
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_RECTANGLE:
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_CUBE_MAP:
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D_ARRAY:
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D_ARRAY:
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_EXTERNAL_OES:
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 2;
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_3D:
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D_ARRAY:
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D_ARRAY:
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 3;
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_BUFFER:
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* fall-through */
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(NULL, "invalid target 0x%x in get_texture_dimensions()",
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    target);
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 2;
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the maximum number of mipmap levels for the given target
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and the dimensions.
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The dimensions are expected not to include the border.
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLsizei
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_tex_max_num_levels(GLenum target, GLsizei width, GLsizei height,
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             GLsizei depth)
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLsizei size;
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D:
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D_ARRAY:
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      size = width;
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP:
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_ARRAY:
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(width == height);
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      size = width;
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D_ARRAY:
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      size = MAX2(width, height);
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      size = MAX3(width, height, depth);
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_RECTANGLE:
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1;
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1;
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return _mesa_logbase2(size) + 1;
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 000 /* not used anymore */
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glTexImage[123]D can accept a NULL image pointer.  In this case we
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * create a texture image with unspecified image contents per the OpenGL
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * spec.
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLubyte *
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmake_null_texture(GLint width, GLint height, GLint depth, GLenum format)
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(format);
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint numPixels = width * height * depth;
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte *data = (GLubyte *) MALLOC(numPixels * components * sizeof(GLubyte));
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Let's see if anyone finds this.  If glTexImage2D() is called with
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * a NULL image pointer then load the texture image with something
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * interesting instead of leaving it indeterminate.
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (data) {
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      static const char message[8][32] = {
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         "   X   X  XXXXX   XXX     X    ",
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         "   XX XX  X      X   X   X X   ",
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         "   X X X  X      X      X   X  ",
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         "   X   X  XXXX    XXX   XXXXX  ",
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         "   X   X  X          X  X   X  ",
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         "   X   X  X      X   X  X   X  ",
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         "   X   X  XXXXX   XXX   X   X  ",
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         "                               "
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      };
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte *imgPtr = data;
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint h, i, j, k;
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (h = 0; h < depth; h++) {
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < height; i++) {
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint srcRow = 7 - (i % 8);
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (j = 0; j < width; j++) {
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLint srcCol = j % 32;
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLubyte texel = (message[srcRow][srcCol]=='X') ? 255 : 70;
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (k = 0; k < components; k++) {
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  *imgPtr++ = texel;
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return data;
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the size and format-related fields of a gl_texture_image struct
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to zero.  This is used when a proxy texture test fails.
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclear_teximage_fields(struct gl_texture_image *img)
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(img);
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->_BaseFormat = 0;
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->InternalFormat = 0;
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Border = 0;
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Width = 0;
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Height = 0;
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Depth = 0;
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Width2 = 0;
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Height2 = 0;
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Depth2 = 0;
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->WidthLog2 = 0;
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->HeightLog2 = 0;
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->DepthLog2 = 0;
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->TexFormat = MESA_FORMAT_NONE;
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize basic fields of the gl_texture_image struct.
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param img texture image structure to be initialized.
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width image width.
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height image height.
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param depth image depth.
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param border image border.
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param internalFormat internal format.
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format  the actual hardware format (one of MESA_FORMAT_*)
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fills in the fields of \p img with the given information.
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: width, height and depth include the border.
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_init_teximage_fields(struct gl_context *ctx,
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           struct gl_texture_image *img,
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           GLsizei width, GLsizei height, GLsizei depth,
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           GLint border, GLenum internalFormat,
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           gl_format format)
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum target;
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(img);
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(width >= 0);
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(height >= 0);
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(depth >= 0);
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   target = img->TexObject->Target;
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->_BaseFormat = _mesa_base_tex_format( ctx, internalFormat );
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(img->_BaseFormat > 0);
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->InternalFormat = internalFormat;
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Border = border;
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Width = width;
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Height = height;
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Depth = depth;
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->Width2 = width - 2 * border;   /* == 1 << img->WidthLog2; */
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->WidthLog2 = _mesa_logbase2(img->Width2);
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch(target) {
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D:
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_BUFFER:
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D:
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (height == 0)
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         img->Height2 = 0;
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         img->Height2 = 1;
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->HeightLog2 = 0;
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (depth == 0)
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         img->Depth2 = 0;
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         img->Depth2 = 1;
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->DepthLog2 = 0;
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D_ARRAY:
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D_ARRAY:
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->Height2 = height; /* no border */
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->HeightLog2 = 0; /* not used */
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (depth == 0)
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         img->Depth2 = 0;
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         img->Depth2 = 1;
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->DepthLog2 = 0;
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_RECTANGLE:
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP:
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_EXTERNAL_OES:
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D:
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_RECTANGLE:
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_CUBE_MAP:
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->HeightLog2 = _mesa_logbase2(img->Height2);
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (depth == 0)
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         img->Depth2 = 0;
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         img->Depth2 = 1;
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->DepthLog2 = 0;
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D_ARRAY:
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D_ARRAY:
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->HeightLog2 = _mesa_logbase2(img->Height2);
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->Depth2 = depth; /* no border */
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->DepthLog2 = 0; /* not used */
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_3D:
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->HeightLog2 = _mesa_logbase2(img->Height2);
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->Depth2 = depth - 2 * border;   /* == 1 << img->DepthLog2; */
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img->DepthLog2 = _mesa_logbase2(img->Depth2);
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(NULL, "invalid target 0x%x in _mesa_init_teximage_fields()",
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    target);
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->MaxNumLevels =
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_get_tex_max_num_levels(target,
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   img->Width2, img->Height2, img->Depth2);
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->TexFormat = format;
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free and clear fields of the gl_texture_image struct.
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texImage texture image structure to be cleared.
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * After the call, \p texImage will have no data associated with it.  Its
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fields are cleared so that its parent object will test incomplete.
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_clear_texture_image(struct gl_context *ctx,
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          struct gl_texture_image *texImage)
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Driver.FreeTextureImageBuffer(ctx, texImage);
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   clear_teximage_fields(texImage);
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the fallback for Driver.TestProxyTexImage().  Test the texture
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * level, width, height and depth against the ctx->Const limits for textures.
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A hardware driver might override this function if, for example, the
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * max 3D texture size is 512x512x64 (i.e. not a cube).
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that width, height, depth == 0 is not an error.  However, a
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture with zero width/height/depth will be considered "incomplete"
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and texturing will effectively be disabled.
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target  one of GL_PROXY_TEXTURE_1D, GL_PROXY_TEXTURE_2D,
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                GL_PROXY_TEXTURE_3D, GL_PROXY_TEXTURE_RECTANGLE_NV,
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                GL_PROXY_TEXTURE_CUBE_MAP_ARB.
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level  as passed to glTexImage
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param internalFormat  as passed to glTexImage
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format  as passed to glTexImage
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type  as passed to glTexImage
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width  as passed to glTexImage
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height  as passed to glTexImage
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param depth  as passed to glTexImage
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param border  as passed to glTexImage
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if the image is acceptable, GL_FALSE if not acceptable.
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level,
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLint internalFormat, GLenum format, GLenum type,
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLint width, GLint height, GLint depth, GLint border)
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint maxSize;
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) internalFormat;
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) format;
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) type;
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D:
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.MaxTextureLevels)
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); /* level zero size */
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize >>= level;  /* level size */
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (width < 2 * border || width > 2 * border + maxSize)
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_FALSE;
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D:
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.MaxTextureLevels)
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize >>= level;
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (width < 2 * border || width > 2 * border + maxSize)
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (height < 2 * border || height > 2 * border + maxSize)
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_FALSE;
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (height > 0 && !_mesa_is_pow_two(height - 2 * border))
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_FALSE;
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_3D:
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.Max3DTextureLevels)
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1);
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize >>= level;
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (width < 2 * border || width > 2 * border + maxSize)
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (height < 2 * border || height > 2 * border + maxSize)
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (depth < 2 * border || depth > 2 * border + maxSize)
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_FALSE;
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (height > 0 && !_mesa_is_pow_two(height - 2 * border))
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_FALSE;
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (depth > 0 && !_mesa_is_pow_two(depth - 2 * border))
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_FALSE;
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_RECTANGLE_NV:
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level != 0)
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize = ctx->Const.MaxTextureRectSize;
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (width < 0 || width > maxSize)
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (height < 0 || height > maxSize)
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.MaxCubeTextureLevels)
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1);
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize >>= level;
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (width < 2 * border || width > 2 * border + maxSize)
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (height < 2 * border || height > 2 * border + maxSize)
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_FALSE;
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (height > 0 && !_mesa_is_pow_two(height - 2 * border))
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_FALSE;
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.MaxTextureLevels)
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize >>= level;
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (width < 2 * border || width > 2 * border + maxSize)
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (height < 1 || height > ctx->Const.MaxArrayTextureLayers)
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_FALSE;
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level >= ctx->Const.MaxTextureLevels)
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxSize >>= level;
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (width < 2 * border || width > 2 * border + maxSize)
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (height < 2 * border || height > 2 * border + maxSize)
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (depth < 1 || depth > ctx->Const.MaxArrayTextureLayers)
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_FALSE;
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (height > 0 && !_mesa_is_pow_two(height - 2 * border))
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_FALSE;
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(ctx, "Invalid target in _mesa_test_proxy_teximage");
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if the memory used by the texture would exceed the driver's limit.
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This lets us support a max 3D texture size of 8K (for example) but
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * prevents allocating a full 8K x 8K x 8K texture.
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX this could be rolled into the proxy texture size test (above) but
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we don't have the actual texture internal format at that point.
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglegal_texture_size(struct gl_context *ctx, gl_format format,
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   GLint width, GLint height, GLint depth)
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint64_t bytes = _mesa_format_image_size64(format, width, height, depth);
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint64_t mbytes = bytes / (1024 * 1024); /* convert to MB */
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return mbytes <= (uint64_t) ctx->Const.MaxTextureMbytes;
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return true if the format is only valid for glCompressedTexImage.
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressedteximage_only_format(const struct gl_context *ctx, GLenum format)
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ETC1_RGB8_OES:
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGB8_OES:
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGBA8_OES:
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_R5_G6_B5_OES:
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGBA4_OES:
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGB5_A1_OES:
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGB8_OES:
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGBA8_OES:
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_R5_G6_B5_OES:
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGBA4_OES:
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGB5_A1_OES:
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper function to determine whether a target and specific compression
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * format are supported.
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtarget_can_be_compressed(const struct gl_context *ctx, GLenum target,
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLenum intFormat)
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) intFormat;  /* not used yet */
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D:
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE; /* true for any compressed format so far */
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_CUBE_MAP:
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ctx->Extensions.ARB_texture_cube_map;
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D_ARRAY_EXT:
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (ctx->Extensions.MESA_texture_array ||
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              ctx->Extensions.EXT_texture_array);
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if the given texture target value is legal for a
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glTexImage1/2/3D call.
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglegal_teximage_target(struct gl_context *ctx, GLuint dims, GLenum target)
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dims) {
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 1:
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (target) {
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_1D:
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_1D:
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return _mesa_is_desktop_gl(ctx);
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 2:
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (target) {
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_2D:
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_2D:
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return _mesa_is_desktop_gl(ctx);
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_CUBE_MAP:
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return _mesa_is_desktop_gl(ctx)
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            && ctx->Extensions.ARB_texture_cube_map;
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return ctx->Extensions.ARB_texture_cube_map;
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_RECTANGLE_NV:
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_RECTANGLE_NV:
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return _mesa_is_desktop_gl(ctx)
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            && ctx->Extensions.NV_texture_rectangle;
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_1D_ARRAY_EXT:
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return _mesa_is_desktop_gl(ctx)
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            && (ctx->Extensions.MESA_texture_array ||
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ctx->Extensions.EXT_texture_array);
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 3:
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (target) {
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_3D:
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_3D:
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return _mesa_is_desktop_gl(ctx);
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_2D_ARRAY_EXT:
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return (_mesa_is_desktop_gl(ctx)
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 && (ctx->Extensions.MESA_texture_array ||
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     ctx->Extensions.EXT_texture_array))
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            || _mesa_is_gles3(ctx);
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return _mesa_is_desktop_gl(ctx)
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            && (ctx->Extensions.MESA_texture_array ||
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ctx->Extensions.EXT_texture_array);
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(ctx, "invalid dims=%u in legal_teximage_target()", dims);
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if the given texture target value is legal for a
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glTexSubImage, glCopyTexSubImage or glCopyTexImage call.
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The difference compared to legal_teximage_target() above is that
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * proxy targets are not supported.
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglegal_texsubimage_target(struct gl_context *ctx, GLuint dims, GLenum target)
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dims) {
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 1:
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_is_desktop_gl(ctx) && target == GL_TEXTURE_1D;
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 2:
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (target) {
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_2D:
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return ctx->Extensions.ARB_texture_cube_map;
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_RECTANGLE_NV:
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return _mesa_is_desktop_gl(ctx)
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            && ctx->Extensions.NV_texture_rectangle;
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_1D_ARRAY_EXT:
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return _mesa_is_desktop_gl(ctx)
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            && (ctx->Extensions.MESA_texture_array ||
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ctx->Extensions.EXT_texture_array);
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 3:
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (target) {
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_3D:
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_2D_ARRAY_EXT:
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return (_mesa_is_desktop_gl(ctx)
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 && (ctx->Extensions.MESA_texture_array ||
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     ctx->Extensions.EXT_texture_array))
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            || _mesa_is_gles3(ctx);
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(ctx, "invalid dims=%u in legal_texsubimage_target()",
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    dims);
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper function to determine if a texture object is mutable (in terms
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of GL_ARB_texture_storage).
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmutable_tex_object(struct gl_context *ctx, GLenum target)
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_texture_storage) {
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_texture_object *texObj =
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_get_current_tex_object(ctx, target);
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return !texObj->Immutable;
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLenum
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_es_error_check_format_and_type(GLenum format, GLenum type,
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     unsigned dimensions)
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool type_valid = true;
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA:
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE:
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA:
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      type_valid = (type == GL_UNSIGNED_BYTE
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    || type == GL_FLOAT
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    || type == GL_HALF_FLOAT_OES);
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB:
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      type_valid = (type == GL_UNSIGNED_BYTE
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    || type == GL_UNSIGNED_SHORT_5_6_5
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    || type == GL_FLOAT
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    || type == GL_HALF_FLOAT_OES);
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA:
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      type_valid = (type == GL_UNSIGNED_BYTE
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    || type == GL_UNSIGNED_SHORT_4_4_4_4
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    || type == GL_UNSIGNED_SHORT_5_5_5_1
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    || type == GL_FLOAT
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    || type == GL_HALF_FLOAT_OES
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    || type == GL_UNSIGNED_INT_2_10_10_10_REV);
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_COMPONENT:
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* This format is filtered against invalid dimensionalities elsewhere.
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      type_valid = (type == GL_UNSIGNED_SHORT
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    || type == GL_UNSIGNED_INT);
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_STENCIL:
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* This format is filtered against invalid dimensionalities elsewhere.
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      type_valid = (type == GL_UNSIGNED_INT_24_8);
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGRA_EXT:
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      type_valid = (type == GL_UNSIGNED_BYTE);
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* This feels like a bug in the EXT_texture_format_BGRA8888 spec, but
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * the format does not appear to be allowed for 3D textures in OpenGL
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * ES.
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dimensions != 2)
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_INVALID_VALUE;
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_VALUE;
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION;
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return expected size of a compressed texture.
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressed_tex_size(GLsizei width, GLsizei height, GLsizei depth,
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    GLenum glformat)
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat);
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return _mesa_format_image_size(mesaFormat, width, height, depth);
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return compressed texture block size, in pixels.
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_compressed_block_size(GLenum glformat, GLuint *bw, GLuint *bh)
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat);
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_get_format_block_size(mesaFormat, bw, bh);
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Special value returned by error some texture error checking functions when
1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * an error is detected and the proxy texture image's width/height/depth/format
1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fields should be zeroed-out.
1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PROXY_ERROR 2
1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test the glTexImage[123]D() parameters for errors.
1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dimensions texture image dimensions (must be 1, 2 or 3).
1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target given by the user.
1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level given by the user.
1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param internalFormat internal format given by the user.
1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format pixel data format given by the user.
1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type pixel data type given by the user.
1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width image width given by the user.
1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height image height given by the user.
1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param depth image depth given by the user.
1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param border image border given by the user.
1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return PROXY_ERROR if there's an error that should zero-out the proxy image,
1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         GL_TRUE if a regular GL error is found, or GL_FALSE if no error,
1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies each of the parameters against the constants specified in
1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::Const and the supported extensions, and according
1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the OpenGL specification.
1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum
1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtexture_error_check( struct gl_context *ctx,
1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLuint dimensions, GLenum target,
1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint level, GLint internalFormat,
1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLenum format, GLenum type,
1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint width, GLint height,
1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint depth, GLint border )
1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum proxyTarget = _mesa_get_proxy_target(target);
1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean isProxy = target == proxyTarget;
1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean sizeOK = GL_TRUE;
1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean colorFormat;
1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum err;
1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Even though there are no color-index textures, we still have to support
1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * uploading color-index data and remapping it to RGB via the
1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GL_PIXEL_MAP_I_TO_[RGBA] tables.
1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean indexFormat = (format == GL_COLOR_INDEX);
1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Note: for proxy textures, some error conditions immediately generate
1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * a GL error in the usual way.  But others do not generate a GL error.
1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Instead, they cause the width, height, depth, format fields of the
1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * texture image to be zeroed-out.  The GL spec seems to indicate that the
1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * zero-out behaviour is only used in cases related to memory allocation.
1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */
1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (level < 0 || level >= MAX_TEXTURE_LEVELS) {
1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexImage%dD(level=%d)", dimensions, level);
1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check border */
1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (border < 0 || border > 1 ||
1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ((ctx->API != API_OPENGL ||
1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         target == GL_TEXTURE_RECTANGLE_NV ||
1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0)) {
1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexImage%dD(border=%d)", dimensions, border);
1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (width < 0 || height < 0 || depth < 0) {
1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexImage%dD(width, height or depth < 0)", dimensions);
1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* OpenGL ES 1.x and OpenGL ES 2.0 impose additional restrictions on the
1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * combinations of format, internalFormat, and type that can be used.
1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Formats and types that require additional extensions (e.g., GL_FLOAT
1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * requires GL_OES_texture_float) are filtered elsewhere.
1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_gles(ctx) && !_mesa_is_gles3(ctx)) {
1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format != internalFormat) {
1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_OPERATION,
1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexImage%dD(format = %s, internalFormat = %s)",
1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dimensions,
1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(format),
1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(internalFormat));
1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      err = _mesa_es_error_check_format_and_type(format, type, dimensions);
1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (err != GL_NO_ERROR) {
1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, err,
1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexImage%dD(format = %s, type = %s)",
1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dimensions,
1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(format),
1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(type));
1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Do this simple check before calling the TestProxyTexImage() function */
1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB) {
1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sizeOK = (width == height);
1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Use the proxy texture driver hook to see if the size/level/etc are
1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * legal.
1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sizeOK = sizeOK && ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level,
1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                    internalFormat, format,
1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                    type, width, height,
1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                    depth, border);
1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!sizeOK) {
1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (isProxy) {
1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* No GL error is recorded, but we need to zero-out the image dims */
1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return PROXY_ERROR;
1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexImage%dD(level=%d, width=%d, height=%d, depth=%d)",
1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dimensions, level, width, height, depth);
1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check internalFormat */
1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_base_tex_format(ctx, internalFormat) < 0) {
1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexImage%dD(internalFormat=%s)",
1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dimensions, _mesa_lookup_enum_by_nr(internalFormat));
1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check incoming image format and type */
1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   err = _mesa_error_check_format_and_type(ctx, format, type);
1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (err != GL_NO_ERROR) {
1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, err,
1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexImage%dD(incompatible format 0x%x, type 0x%x)",
1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dimensions, format, type);
1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* make sure internal format and format basically agree */
1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   colorFormat = _mesa_is_color_format(format);
1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((_mesa_is_color_format(internalFormat) && !colorFormat && !indexFormat) ||
1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (_mesa_is_depth_format(internalFormat) != _mesa_is_depth_format(format)) ||
1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (_mesa_is_ycbcr_format(internalFormat) != _mesa_is_ycbcr_format(format)) ||
1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (_mesa_is_depthstencil_format(internalFormat) != _mesa_is_depthstencil_format(format)) ||
1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (_mesa_is_dudv_format(internalFormat) != _mesa_is_dudv_format(format))) {
1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexImage%dD(incompatible internalFormat 0x%x, format 0x%x)",
1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dimensions, internalFormat, format);
1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* additional checks for ycbcr textures */
1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (internalFormat == GL_YCBCR_MESA) {
1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(ctx->Extensions.MESA_ycbcr_texture);
1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (type != GL_UNSIGNED_SHORT_8_8_MESA &&
1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          type != GL_UNSIGNED_SHORT_8_8_REV_MESA) {
1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         char message[100];
1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_snprintf(message, sizeof(message),
1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        "glTexImage%dD(format/type YCBCR mismatch)",
1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        dimensions);
1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_ENUM, "%s", message);
1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE; /* error */
1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (target != GL_TEXTURE_2D &&
1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_PROXY_TEXTURE_2D &&
1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_TEXTURE_RECTANGLE_NV &&
1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_PROXY_TEXTURE_RECTANGLE_NV) {
1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_ENUM,
1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexImage%dD(bad target for YCbCr texture)",
1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dimensions);
1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (border != 0) {
1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         char message[100];
1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_snprintf(message, sizeof(message),
1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        "glTexImage%dD(format=GL_YCBCR_MESA and border=%d)",
1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        dimensions, border);
1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE, "%s", message);
1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* additional checks for depth textures */
1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_base_tex_format(ctx, internalFormat) == GL_DEPTH_COMPONENT) {
1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Only 1D, 2D, rect, array and cube textures supported, not 3D
1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Cubemaps are only supported for GL version > 3.0 or with EXT_gpu_shader4 */
1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (target != GL_TEXTURE_1D &&
1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_PROXY_TEXTURE_1D &&
1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_TEXTURE_2D &&
1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_PROXY_TEXTURE_2D &&
1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_TEXTURE_1D_ARRAY &&
1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_PROXY_TEXTURE_1D_ARRAY &&
1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_TEXTURE_2D_ARRAY &&
1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_PROXY_TEXTURE_2D_ARRAY &&
1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_TEXTURE_RECTANGLE_ARB &&
1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          target != GL_PROXY_TEXTURE_RECTANGLE_ARB &&
1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         !((_mesa_is_cube_face(target) || target == GL_PROXY_TEXTURE_CUBE_MAP) &&
1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4))) {
1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_ENUM,
1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexImage%dD(bad target for depth texture)",
1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dimensions);
1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* additional checks for compressed textures */
1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_compressed_format(ctx, internalFormat)) {
1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!target_can_be_compressed(ctx, target, internalFormat)) {
1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_ENUM,
1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexImage%dD(target can't be compressed)", dimensions);
1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (compressedteximage_only_format(ctx, internalFormat)) {
1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_OPERATION,
1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexImage%dD(no compression for format)", dimensions);
1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (border != 0) {
1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_OPERATION,
1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexImage%dD(border!=0)", dimensions);
1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* additional checks for integer textures */
1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((ctx->Version >= 30 || ctx->Extensions.EXT_texture_integer) &&
1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (_mesa_is_enum_format_integer(format) !=
1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        _mesa_is_enum_format_integer(internalFormat))) {
1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexImage%dD(integer/non-integer format mismatch)",
1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dimensions);
1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mutable_tex_object(ctx, target)) {
1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexImage%dD(immutable texture)", dimensions);
1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* if we get here, the parameters are OK */
1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_FALSE;
1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Error checking for glCompressedTexImage[123]D().
1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param reason  returns reason for error, if any
1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return error code or GL_NO_ERROR or PROXY_ERROR.
1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum
1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressed_texture_error_check(struct gl_context *ctx, GLint dimensions,
1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLenum target, GLint level,
1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLenum internalFormat, GLsizei width,
1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLsizei height, GLsizei depth, GLint border,
1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLsizei imageSize)
1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum proxyTarget = _mesa_get_proxy_target(target);
1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint maxLevels = _mesa_max_texture_levels(ctx, target);
1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint expectedSize;
1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum choose_format;
1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum choose_type;
1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum proxy_format;
1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum error = GL_NO_ERROR;
1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char *reason = ""; /* no error */
1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!target_can_be_compressed(ctx, target, internalFormat)) {
1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reason = "target";
1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      error = GL_INVALID_ENUM;
1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error;
1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* This will detect any invalid internalFormat value */
1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_is_compressed_format(ctx, internalFormat)) {
1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reason = "internalFormat";
1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      error = GL_INVALID_ENUM;
1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error;
1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (internalFormat) {
1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_ES
1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGB8_OES:
2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGBA8_OES:
2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_R5_G6_B5_OES:
2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGBA4_OES:
2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGB5_A1_OES:
2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGB8_OES:
2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGBA8_OES:
2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_R5_G6_B5_OES:
2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGBA4_OES:
2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGB5_A1_OES:
2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_cpal_compressed_format_type(internalFormat, &choose_format,
2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					&choose_type);
2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      proxy_format = choose_format;
2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* check level (note that level should be zero or less!) */
2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level > 0 || level < -maxLevels) {
2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 reason = "level";
2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 error = GL_INVALID_VALUE;
2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         goto error;
2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dimensions != 2) {
2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 reason = "compressed paletted textures must be 2D";
2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 error = GL_INVALID_OPERATION;
2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         goto error;
2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Figure out the expected texture size (in bytes).  This will be
2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * checked against the actual size later.
2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      expectedSize = _mesa_cpal_compressed_size(level, internalFormat,
2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						width, height);
2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* This is for the benefit of the TestProxyTexImage below.  It expects
2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * level to be non-negative.  OES_compressed_paletted_texture uses a
2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * weird mechanism where the level specified to glCompressedTexImage2D
2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * is -(n-1) number of levels in the texture, and the data specifies the
2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * complete mipmap stack.  This is done to ensure the palette is the
2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * same for all levels.
2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      level = -level;
2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      choose_format = GL_NONE;
2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      choose_type = GL_NONE;
2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      proxy_format = internalFormat;
2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* check level */
2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level < 0 || level >= maxLevels) {
2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 reason = "level";
2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 error = GL_INVALID_VALUE;
2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         goto error;
2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Figure out the expected texture size (in bytes).  This will be
2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * checked against the actual size later.
2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      expectedSize = compressed_tex_size(width, height, depth, internalFormat);
2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* This should really never fail */
2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_base_tex_format(ctx, internalFormat) < 0) {
2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reason = "internalFormat";
2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      error = GL_INVALID_ENUM;
2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error;
2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* No compressed formats support borders at this time */
2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (border != 0) {
2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reason = "border != 0";
2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      error = GL_INVALID_VALUE;
2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error;
2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* For cube map, width must equal height */
2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_cube_face(target) && width != height) {
2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reason = "width != height";
2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      error = GL_INVALID_VALUE;
2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error;
2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check image sizes */
2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level,
2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      proxy_format, choose_format,
2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      choose_type,
2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      width, height, depth, border)) {
2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* See error comment above */
2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (target == proxyTarget) {
2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return PROXY_ERROR;
2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reason = "invalid width, height or format";
2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      error = GL_INVALID_OPERATION;
2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error;
2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check image size in bytes */
2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (expectedSize != imageSize) {
2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Per GL_ARB_texture_compression:  GL_INVALID_VALUE is generated [...]
2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * if <imageSize> is not consistent with the format, dimensions, and
2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * contents of the specified image.
2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reason = "imageSize inconsistant with width/height/format";
2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      error = GL_INVALID_VALUE;
2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error;
2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mutable_tex_object(ctx, target)) {
2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reason = "immutable texture";
2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      error = GL_INVALID_OPERATION;
2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error;
2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_NO_ERROR;
2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerror:
2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_error(ctx, error, "glCompressedTexImage%dD(%s)", dimensions, reason);
2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return error;
2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test glTexSubImage[123]D() parameters for errors.
2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dimensions texture image dimensions (must be 1, 2 or 3).
2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target given by the user.
2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level given by the user.
2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param xoffset sub-image x offset given by the user.
2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param yoffset sub-image y offset given by the user.
2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param zoffset sub-image z offset given by the user.
2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format pixel data format given by the user.
2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type pixel data type given by the user.
2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width image width given by the user.
2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height image height given by the user.
2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param depth image depth given by the user.
2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if an error was detected, or GL_FALSE if no errors.
2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies each of the parameters against the constants specified in
2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::Const and the supported extensions, and according
2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the OpenGL specification.
2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsubtexture_error_check( struct gl_context *ctx, GLuint dimensions,
2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLenum target, GLint level,
2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLint xoffset, GLint yoffset, GLint zoffset,
2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLint width, GLint height, GLint depth,
2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLenum format, GLenum type )
2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum err;
2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Basic level check */
2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (level < 0 || level >= MAX_TEXTURE_LEVELS) {
2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glTexSubImage2D(level=%d)", level);
2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check for negative sizes */
2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (width < 0) {
2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexSubImage%dD(width=%d)", dimensions, width);
2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (height < 0 && dimensions > 1) {
2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexSubImage%dD(height=%d)", dimensions, height);
2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (depth < 0 && dimensions > 2) {
2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexSubImage%dD(depth=%d)", dimensions, depth);
2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* OpenGL ES 1.x and OpenGL ES 2.0 impose additional restrictions on the
2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * combinations of format and type that can be used.  Formats and types
2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * that require additional extensions (e.g., GL_FLOAT requires
2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GL_OES_texture_float) are filtered elsewhere.
2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_gles(ctx) && !_mesa_is_gles3(ctx)) {
2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      err = _mesa_es_error_check_format_and_type(format, type, dimensions);
2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (err != GL_NO_ERROR) {
2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, err,
2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexSubImage%dD(format = %s, type = %s)",
2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dimensions,
2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(format),
2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(type));
2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   err = _mesa_error_check_format_and_type(ctx, format, type);
2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (err != GL_NO_ERROR) {
2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, err,
2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glTexSubImage%dD(incompatible format 0x%x, type 0x%x)",
2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dimensions, format, type);
2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_FALSE;
2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do second part of glTexSubImage which depends on the destination texture.
2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if error recorded, GL_FALSE otherwise
2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsubtexture_error_check2( struct gl_context *ctx, GLuint dimensions,
2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 GLenum target, GLint level,
2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 GLint xoffset, GLint yoffset, GLint zoffset,
2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 GLint width, GLint height, GLint depth,
2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 GLenum format, GLenum type,
2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 const struct gl_texture_image *destTex )
2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!destTex) {
2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* undefined image level */
2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexSubImage%dD", dimensions);
2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xoffset < -((GLint)destTex->Border)) {
2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(xoffset)",
2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dimensions);
2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xoffset + width > (GLint) (destTex->Width + destTex->Border)) {
2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(xoffset+width)",
2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dimensions);
2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dimensions > 1) {
2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint yBorder = (target == GL_TEXTURE_1D_ARRAY) ? 0 : destTex->Border;
2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (yoffset < -yBorder) {
2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(yoffset)",
2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dimensions);
2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (yoffset + height > (GLint) destTex->Height + yBorder) {
2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(yoffset+height)",
2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dimensions);
2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dimensions > 2) {
2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint zBorder = (target == GL_TEXTURE_2D_ARRAY) ? 0 : destTex->Border;
2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (zoffset < -zBorder) {
2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset)");
2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (zoffset + depth  > (GLint) destTex->Depth + zBorder) {
2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset+depth)");
2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_format_compressed(destTex->TexFormat)) {
2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint bw, bh;
2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (compressedteximage_only_format(ctx, destTex->InternalFormat)) {
2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_OPERATION,
2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               "glTexSubImage%dD(no compression for format)", dimensions);
2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* do tests which depend on compression block size */
2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_get_format_block_size(destTex->TexFormat, &bw, &bh);
2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* offset must be multiple of block size */
2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((xoffset % bw != 0) || (yoffset % bh != 0)) {
2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_OPERATION,
2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexSubImage%dD(xoffset = %d, yoffset = %d)",
2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dimensions, xoffset, yoffset);
2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* size must be multiple of bw by bh or equal to whole texture size */
2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((width % bw != 0) && (GLuint) width != destTex->Width) {
2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_OPERATION,
2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexSubImage%dD(width = %d)", dimensions, width);
2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((height % bh != 0) && (GLuint) height != destTex->Height) {
2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_OPERATION,
2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexSubImage%dD(height = %d)", dimensions, height);
2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Version >= 30 || ctx->Extensions.EXT_texture_integer) {
2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* both source and dest must be integer-valued, or neither */
2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (_mesa_is_format_integer_color(destTex->TexFormat) !=
2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          _mesa_is_enum_format_integer(format)) {
2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_OPERATION,
2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexSubImage%dD(integer/non-integer format mismatch)",
2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dimensions);
2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_FALSE;
2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test glCopyTexImage[12]D() parameters for errors.
2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dimensions texture image dimensions (must be 1, 2 or 3).
2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target given by the user.
2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level given by the user.
2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param internalFormat internal format given by the user.
2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width image width given by the user.
2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height image height given by the user.
2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param border texture border.
2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if an error was detected, or GL_FALSE if no errors.
2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies each of the parameters against the constants specified in
2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::Const and the supported extensions, and according
2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the OpenGL specification.
2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopytexture_error_check( struct gl_context *ctx, GLuint dimensions,
2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLenum target, GLint level, GLint internalFormat,
2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint width, GLint height, GLint border )
2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum proxyTarget = _mesa_get_proxy_target(target);
2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum type = GL_FLOAT;
2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean sizeOK;
2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint baseFormat;
2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check target */
2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!legal_texsubimage_target(ctx, dimensions, target)) {
2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glCopyTexImage%uD(target=%s)",
2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dimensions, _mesa_lookup_enum_by_nr(target));
2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */
2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (level < 0 || level >= MAX_TEXTURE_LEVELS) {
2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexImage%dD(level=%d)", dimensions, level);
2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check that the source buffer is complete */
2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_user_fbo(ctx->ReadBuffer)) {
2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->ReadBuffer->_Status == 0) {
2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_test_framebuffer_completeness(ctx, ctx->ReadBuffer);
2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexImage%dD(invalid readbuffer)", dimensions);
2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->ReadBuffer->Visual.samples > 0) {
2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_error(ctx, GL_INVALID_OPERATION,
2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     "glCopyTexImage%dD(multisample FBO)",
2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     dimensions);
2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check border */
2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (border < 0 || border > 1 ||
2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ((ctx->API != API_OPENGL ||
2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         target == GL_TEXTURE_RECTANGLE_NV ||
2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0)) {
2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexImage%dD(border=%d)", dimensions, border);
2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* OpenGL ES 1.x and OpenGL ES 2.0 impose additional restrictions on the
2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * internalFormat.
2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_gles(ctx) && !_mesa_is_gles3(ctx)) {
2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA:
2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB:
2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA:
2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE:
2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA:
2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexImage%dD(internalFormat)", dimensions);
2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   baseFormat = _mesa_base_tex_format(ctx, internalFormat);
2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (baseFormat < 0) {
2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexImage%dD(internalFormat)", dimensions);
2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_source_buffer_exists(ctx, baseFormat)) {
2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexImage%dD(missing readbuffer)", dimensions);
2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* From the EXT_texture_integer spec:
2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     "INVALID_OPERATION is generated by CopyTexImage* and CopyTexSubImage*
2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *      if the texture internalformat is an integer format and the read color
2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *      buffer is not an integer format, or if the internalformat is not an
2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *      integer format and the read color buffer is an integer format."
2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_color_format(internalFormat)) {
2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (_mesa_is_enum_format_integer(rb->InternalFormat) !=
2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  _mesa_is_enum_format_integer(internalFormat)) {
2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_error(ctx, GL_INVALID_OPERATION,
2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     "glCopyTexImage%dD(integer vs non-integer)", dimensions);
2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Do size, level checking */
2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sizeOK = (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB)
2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? (width == height) : 1;
2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sizeOK = sizeOK && ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level,
2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                    internalFormat, baseFormat,
2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                    type, width, height,
2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                    1, border);
2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!sizeOK) {
2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dimensions == 1) {
2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexImage1D(width=%d)", width);
2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ASSERT(dimensions == 2);
2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexImage2D(width=%d, height=%d)", width, height);
2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_compressed_format(ctx, internalFormat)) {
2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!target_can_be_compressed(ctx, target, internalFormat)) {
2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_ENUM,
2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexImage%dD(target)", dimensions);
2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (compressedteximage_only_format(ctx, internalFormat)) {
2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_OPERATION,
2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               "glCopyTexImage%dD(no compression for format)", dimensions);
2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (border != 0) {
2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_OPERATION,
2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexImage%dD(border!=0)", dimensions);
2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mutable_tex_object(ctx, target)) {
2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexImage%dD(immutable texture)", dimensions);
2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* if we get here, the parameters are OK */
2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_FALSE;
2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test glCopyTexSubImage[12]D() parameters for errors.
2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that this is the first part of error checking.
2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See also copytexsubimage_error_check2() below for the second part.
2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dimensions texture image dimensions (must be 1, 2 or 3).
2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target given by the user.
2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level given by the user.
2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if an error was detected, or GL_FALSE if no errors.
2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopytexsubimage_error_check1( struct gl_context *ctx, GLuint dimensions,
2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLenum target, GLint level)
2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check that the source buffer is complete */
2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_user_fbo(ctx->ReadBuffer)) {
2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->ReadBuffer->_Status == 0) {
2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_test_framebuffer_completeness(ctx, ctx->ReadBuffer);
2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexImage%dD(invalid readbuffer)", dimensions);
2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->ReadBuffer->Visual.samples > 0) {
2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_error(ctx, GL_INVALID_OPERATION,
2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     "glCopyTexSubImage%dD(multisample FBO)",
2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     dimensions);
2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check target (proxies not allowed) */
2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!legal_texsubimage_target(ctx, dimensions, target)) {
2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glCopyTexSubImage%uD(target=%s)",
2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dimensions, _mesa_lookup_enum_by_nr(target));
2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check level */
2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (level < 0 || level >= MAX_TEXTURE_LEVELS) {
2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexSubImage%dD(level=%d)", dimensions, level);
2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_FALSE;
2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Second part of error checking for glCopyTexSubImage[12]D().
2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param xoffset sub-image x offset given by the user.
2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param yoffset sub-image y offset given by the user.
2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param zoffset sub-image z offset given by the user.
2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width image width given by the user.
2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height image height given by the user.
2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopytexsubimage_error_check2( struct gl_context *ctx, GLuint dimensions,
2540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLenum target, GLint level,
2541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLint xoffset, GLint yoffset, GLint zoffset,
2542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLsizei width, GLsizei height,
2543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      const struct gl_texture_image *teximage )
2544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check that dest tex image exists */
2546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!teximage) {
2547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
2548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexSubImage%dD(undefined texture level: %d)",
2549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dimensions, level);
2550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check size */
2554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (width < 0) {
2555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
2556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexSubImage%dD(width=%d)", dimensions, width);
2557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dimensions > 1 && height < 0) {
2560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
2561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexSubImage%dD(height=%d)", dimensions, height);
2562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check x/y offsets */
2566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xoffset < -((GLint)teximage->Border)) {
2567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
2568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexSubImage%dD(xoffset=%d)", dimensions, xoffset);
2569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xoffset + width > (GLint) (teximage->Width + teximage->Border)) {
2572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
2573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexSubImage%dD(xoffset+width)", dimensions);
2574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dimensions > 1) {
2577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint yBorder = (target == GL_TEXTURE_1D_ARRAY) ? 0 : teximage->Border;
2578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (yoffset < -yBorder) {
2579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
2580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexSubImage%dD(yoffset=%d)", dimensions, yoffset);
2581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* NOTE: we're adding the border here, not subtracting! */
2584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (yoffset + height > (GLint) teximage->Height + yBorder) {
2585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
2586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexSubImage%dD(yoffset+height)", dimensions);
2587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check z offset */
2592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dimensions > 2) {
2593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint zBorder = (target == GL_TEXTURE_2D_ARRAY) ? 0 : teximage->Border;
2594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (zoffset < -zBorder) {
2595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
2596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexSubImage%dD(zoffset)", dimensions);
2597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (zoffset > (GLint) teximage->Depth + zBorder) {
2600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
2601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexSubImage%dD(zoffset+depth)", dimensions);
2602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_format_compressed(teximage->TexFormat)) {
2607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (compressedteximage_only_format(ctx, teximage->InternalFormat)) {
2608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_OPERATION,
2609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               "glCopyTexSubImage%dD(no compression for format)", dimensions);
2610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* offset must be multiple of 4 */
2613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((xoffset & 3) || (yoffset & 3)) {
2614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
2615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexSubImage%dD(xoffset or yoffset)", dimensions);
2616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* size must be multiple of 4 */
2619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((width & 3) != 0 && (GLuint) width != teximage->Width) {
2620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
2621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexSubImage%dD(width)", dimensions);
2622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((height & 3) != 0 && (GLuint) height != teximage->Height) {
2625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
2626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCopyTexSubImage%dD(height)", dimensions);
2627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
2628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (teximage->InternalFormat == GL_YCBCR_MESA) {
2632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glCopyTexSubImage2D");
2633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_source_buffer_exists(ctx, teximage->_BaseFormat)) {
2637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
2638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCopyTexSubImage%dD(missing readbuffer, format=0x%x)",
2639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dimensions, teximage->_BaseFormat);
2640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
2641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* From the EXT_texture_integer spec:
2644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
2645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     "INVALID_OPERATION is generated by CopyTexImage* and CopyTexSubImage*
2646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *      if the texture internalformat is an integer format and the read color
2647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *      buffer is not an integer format, or if the internalformat is not an
2648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *      integer format and the read color buffer is an integer format."
2649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_color_format(teximage->InternalFormat)) {
2651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
2652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (_mesa_is_format_integer_color(rb->Format) !=
2654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  _mesa_is_format_integer_color(teximage->TexFormat)) {
2655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_error(ctx, GL_INVALID_OPERATION,
2656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     "glCopyTexImage%dD(integer vs non-integer)", dimensions);
2657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
2658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* if we get here, the parameters are OK */
2662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_FALSE;
2663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Callback info for walking over FBO hash table */
2667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct cb_info
2668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx;
2670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *texObj;
2671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint level, face;
2672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
2673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check render to texture callback.  Called from _mesa_HashWalk().
2677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcheck_rtt_cb(GLuint key, void *data, void *userData)
2680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_framebuffer *fb = (struct gl_framebuffer *) data;
2682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct cb_info *info = (struct cb_info *) userData;
2683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = info->ctx;
2684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_texture_object *texObj = info->texObj;
2685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint level = info->level, face = info->face;
2686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* If this is a user-created FBO */
2688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_user_fbo(fb)) {
2689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
2690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* check if any of the FBO's attachments point to 'texObj' */
2691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < BUFFER_COUNT; i++) {
2692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct gl_renderbuffer_attachment *att = fb->Attachment + i;
2693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (att->Type == GL_TEXTURE &&
2694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             att->Texture == texObj &&
2695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             att->TextureLevel == level &&
2696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             att->CubeMapFace == face) {
2697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(_mesa_get_attachment_teximage(att));
2698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* Tell driver about the new renderbuffer texture */
2699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->Driver.RenderTexture(ctx, ctx->DrawBuffer, att);
2700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* Mark fb status as indeterminate to force re-validation */
2701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            fb->_Status = 0;
2702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When a texture image is specified we have to check if it's bound to
2710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * any framebuffer objects (render to texture) in order to detect changes
2711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in size or format since that effects FBO completeness.
2712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Any FBOs rendering into the texture must be re-validated.
2713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
2715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_update_fbo_texture(struct gl_context *ctx,
2716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         struct gl_texture_object *texObj,
2717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLuint face, GLuint level)
2718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Only check this texture if it's been marked as RenderToTexture */
2720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (texObj->_RenderToTexture) {
2721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct cb_info info;
2722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.ctx = ctx;
2723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.texObj = texObj;
2724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.level = level;
2725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.face = face;
2726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_HashWalk(ctx->Shared->FrameBuffers, check_rtt_cb, &info);
2727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If the texture object's GenerateMipmap flag is set and we've
2733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * changed the texture base level image, regenerate the rest of the
2734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mipmap levels now.
2735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline void
2737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcheck_gen_mipmap(struct gl_context *ctx, GLenum target,
2738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct gl_texture_object *texObj, GLint level)
2739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(target != GL_TEXTURE_CUBE_MAP);
2741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (texObj->GenerateMipmap &&
2742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       level == texObj->BaseLevel &&
2743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       level < texObj->MaxLevel) {
2744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(ctx->Driver.GenerateMipmap);
2745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.GenerateMipmap(ctx, target, texObj);
2746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Debug helper: override the user-requested internal format */
2751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum
2752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgoverride_internal_format(GLenum internalFormat, GLint width, GLint height)
2753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
2755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (internalFormat == GL_RGBA16F_ARB ||
2756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       internalFormat == GL_RGBA32F_ARB) {
2757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("Convert rgba float tex to int %d x %d\n", width, height);
2758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RGBA;
2759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (internalFormat == GL_RGB16F_ARB ||
2761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            internalFormat == GL_RGB32F_ARB) {
2762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("Convert rgb float tex to int %d x %d\n", width, height);
2763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RGB;
2764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (internalFormat == GL_LUMINANCE_ALPHA16F_ARB ||
2766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            internalFormat == GL_LUMINANCE_ALPHA32F_ARB) {
2767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("Convert luminance float tex to int %d x %d\n", width, height);
2768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_LUMINANCE_ALPHA;
2769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (internalFormat == GL_LUMINANCE16F_ARB ||
2771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            internalFormat == GL_LUMINANCE32F_ARB) {
2772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("Convert luminance float tex to int %d x %d\n", width, height);
2773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_LUMINANCE;
2774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (internalFormat == GL_ALPHA16F_ARB ||
2776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            internalFormat == GL_ALPHA32F_ARB) {
2777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("Convert luminance float tex to int %d x %d\n", width, height);
2778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_ALPHA;
2779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
2781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) {
2782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      internalFormat = GL_RGBA;
2783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   */
2785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return internalFormat;
2787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
2789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return internalFormat;
2790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
2791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Choose the actual hardware format for a texture image.
2796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Try to use the same format as the previous image level when possible.
2797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Otherwise, ask the driver for the best format.
2798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * It's important to try to choose a consistant format for all levels
2799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for efficient texture memory layout/allocation.  In particular, this
2800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * comes up during automatic mipmap generation.
2801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format
2803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_choose_texture_format(struct gl_context *ctx,
2804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct gl_texture_object *texObj,
2805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLenum target, GLint level,
2806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLenum internalFormat, GLenum format, GLenum type)
2807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format f;
2809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* see if we've already chosen a format for the previous level */
2811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (level > 0) {
2812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_texture_image *prevImage =
2813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_select_tex_image(ctx, texObj, target, level - 1);
2814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* See if the prev level is defined and has an internal format which
2815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * matches the new internal format.
2816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
2817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (prevImage &&
2818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          prevImage->Width > 0 &&
2819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          prevImage->InternalFormat == internalFormat) {
2820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* use the same format */
2821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ASSERT(prevImage->TexFormat != MESA_FORMAT_NONE);
2822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return prevImage->TexFormat;
2823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* If the application requested compression to an S3TC format but we don't
2827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * have the DTXn library, force a generic compressed format instead.
2828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (internalFormat != format && format != GL_NONE) {
2830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLenum before = internalFormat;
2831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
2833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
2834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!ctx->Mesa_DXTn)
2835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            internalFormat = GL_COMPRESSED_RGB;
2836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
2838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
2839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
2840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!ctx->Mesa_DXTn)
2841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            internalFormat = GL_COMPRESSED_RGBA;
2842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
2844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (before != internalFormat) {
2848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_warning(ctx,
2849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       "DXT compression requested (%s), "
2850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       "but libtxc_dxtn library not installed.  Using %s "
2851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       "instead.",
2852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       _mesa_lookup_enum_by_nr(before),
2853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       _mesa_lookup_enum_by_nr(internalFormat));
2854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* choose format from scratch */
2858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   f = ctx->Driver.ChooseTextureFormat(ctx, texObj->Target, internalFormat,
2859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       format, type);
2860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(f != MESA_FORMAT_NONE);
2861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return f;
2862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Adjust pixel unpack params and image dimensions to strip off the
2866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * one-pixel texture border.
2867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
2868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Gallium and intel don't support texture borders.  They've seldem been used
2869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and seldom been implemented correctly anyway.
2870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
2871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param unpackNew returns the new pixel unpack parameters
2872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstrip_texture_border(GLenum target,
2875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint *width, GLint *height, GLint *depth,
2876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const struct gl_pixelstore_attrib *unpack,
2877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct gl_pixelstore_attrib *unpackNew)
2878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(width);
2880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(height);
2881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(depth);
2882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *unpackNew = *unpack;
2884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unpackNew->RowLength == 0)
2886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unpackNew->RowLength = *width;
2887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unpackNew->ImageHeight == 0)
2889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unpackNew->ImageHeight = *height;
2890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(*width >= 3);
2892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unpackNew->SkipPixels++;  /* skip the border */
2893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *width = *width - 2;      /* reduce the width by two border pixels */
2894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The min height of a texture with a border is 3 */
2896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*height >= 3 && target != GL_TEXTURE_1D_ARRAY) {
2897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unpackNew->SkipRows++;  /* skip the border */
2898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *height = *height - 2;  /* reduce the height by two border pixels */
2899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*depth >= 3 && target != GL_TEXTURE_2D_ARRAY) {
2902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unpackNew->SkipImages++;  /* skip the border */
2903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *depth = *depth - 2;      /* reduce the depth by two border pixels */
2904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Common code to implement all the glTexImage1D/2D/3D functions
2910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as well as glCompressedTexImage1D/2D/3D.
2911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param compressed  only GL_TRUE for glCompressedTexImage1D/2D/3D calls.
2912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format  the user's image format (only used if !compressed)
2913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type  the user's image type (only used if !compressed)
2914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param imageSize  only used for glCompressedTexImage1D/2D/3D calls.
2915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgteximage(struct gl_context *ctx, GLboolean compressed, GLuint dims,
2918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLenum target, GLint level, GLint internalFormat,
2919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLsizei width, GLsizei height, GLsizei depth,
2920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint border, GLenum format, GLenum type,
2921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLsizei imageSize, const GLvoid *pixels)
2922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *func = compressed ? "glCompressedTexImage" : "glTexImage";
2924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum error;
2925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_pixelstore_attrib unpack_no_border;
2926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_pixelstore_attrib *unpack = &ctx->Unpack;
2927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) {
2931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (compressed)
2932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_debug(ctx,
2933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCompressedTexImage%uD %s %d %s %d %d %d %d %p\n",
2934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dims,
2935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(target), level,
2936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(internalFormat),
2937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     width, height, depth, border, pixels);
2938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
2939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_debug(ctx,
2940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glTexImage%uD %s %d %s %d %d %d %d %s %s %p\n",
2941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dims,
2942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(target), level,
2943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(internalFormat),
2944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     width, height, depth, border,
2945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(format),
2946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     _mesa_lookup_enum_by_nr(type), pixels);
2947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   internalFormat = override_internal_format(internalFormat, width, height);
2950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* target error checking */
2952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!legal_teximage_target(ctx, dims, target)) {
2953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "%s%uD(target=%s)",
2954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  func, dims, _mesa_lookup_enum_by_nr(target));
2955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
2956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* general error checking */
2959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (compressed) {
2960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      error = compressed_texture_error_check(ctx, dims, target, level,
2961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             internalFormat,
2962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             width, height, depth,
2963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             border, imageSize);
2964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      error = texture_error_check(ctx, dims, target, level, internalFormat,
2967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  format, type, width, height, depth, border);
2968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_ES
2971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Here we convert a cpal compressed image into a regular glTexImage2D
2972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * call by decompressing the texture.  If we really want to support cpal
2973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * textures in any driver this would have to be changed.
2974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (compressed && !error && dims == 2) {
2976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
2977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE4_RGB8_OES:
2978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE4_RGBA8_OES:
2979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE4_R5_G6_B5_OES:
2980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE4_RGBA4_OES:
2981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE4_RGB5_A1_OES:
2982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE8_RGB8_OES:
2983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE8_RGBA8_OES:
2984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE8_R5_G6_B5_OES:
2985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE8_RGBA4_OES:
2986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_PALETTE8_RGB5_A1_OES:
2987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_cpal_compressed_teximage2d(target, level, internalFormat,
2988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          width, height, imageSize, pixels);
2989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
2990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
2993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_proxy_texture(target)) {
2995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Proxy texture: just clear or set state depending on error checking */
2996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_texture_image *texImage =
2997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         get_proxy_tex_image(ctx, target, level);
2998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      gl_format texFormat = MESA_FORMAT_NONE;
2999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!error) {
3001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* No parameter errors.  Choose a texture format and see if we
3002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * can really allocate the texture.
3003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
3004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct gl_texture_object *texObj =
3005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_get_current_tex_object(ctx, target);
3006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         texFormat = _mesa_choose_texture_format(ctx, texObj, target, level,
3007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 internalFormat, format, type);
3008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!legal_texture_size(ctx, texFormat, width, height, depth)) {
3009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            error = PROXY_ERROR;
3010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (error == PROXY_ERROR) {
3014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* image too large, etc.  Clear all proxy texture image parameters. */
3015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (texImage)
3016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            clear_teximage_fields(texImage);
3017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (error == GL_FALSE) {
3019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* no error: store the teximage parameters */
3020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (texImage)
3021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_init_teximage_fields(ctx, texImage, width, height, depth,
3022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       border, internalFormat, texFormat);
3023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
3025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* other, regular error (was already recorded) */
3026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* non-proxy target */
3030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint face = _mesa_tex_target_to_face(target);
3031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_texture_object *texObj;
3032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_texture_image *texImage;
3033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (error) {
3035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;   /* error was recorded */
3036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Allow a hardware driver to just strip out the border, to provide
3039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * reliable but slightly incorrect hardware rendering instead of
3040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * rarely-tested software fallback rendering.
3041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
3042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (border && ctx->Const.StripTextureBorder) {
3043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 strip_texture_border(target, &width, &height, &depth, unpack,
3044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      &unpack_no_border);
3045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         border = 0;
3046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 unpack = &unpack_no_border;
3047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->NewState & _NEW_PIXEL)
3050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_update_state(ctx);
3051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texObj = _mesa_get_current_tex_object(ctx, target);
3053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_lock_texture(ctx, texObj);
3055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
3056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 texImage = _mesa_get_tex_image(ctx, texObj, target, level);
3057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (!texImage) {
3059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s%uD", func, dims);
3060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
3061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
3062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            gl_format texFormat;
3063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->Driver.FreeTextureImageBuffer(ctx, texImage);
3065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            texFormat = _mesa_choose_texture_format(ctx, texObj, target, level,
3067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                    internalFormat, format,
3068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                    type);
3069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (legal_texture_size(ctx, texFormat, width, height, depth)) {
3071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               _mesa_init_teximage_fields(ctx, texImage,
3072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          width, height, depth,
3073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          border, internalFormat, texFormat);
3074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               /* Give the texture to the driver.  <pixels> may be null. */
3076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (width > 0 && height > 0 && depth > 0) {
3077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  if (compressed) {
3078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     ctx->Driver.CompressedTexImage(ctx, dims, texImage,
3079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                    imageSize, pixels);
3080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  }
3081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  else {
3082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     ctx->Driver.TexImage(ctx, dims, texImage, format,
3083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          type, pixels, unpack);
3084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  }
3085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               check_gen_mipmap(ctx, target, texObj, level);
3088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               _mesa_update_fbo_texture(ctx, texObj, face, level);
3090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               _mesa_dirty_texobj(ctx, texObj, GL_TRUE);
3092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else {
3094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s%uD", func, dims);
3095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_unlock_texture(ctx, texObj);
3099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
3104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called from the API.  Note that width includes the border.
3105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
3106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
3108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLsizei width, GLint border, GLenum format,
3109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLenum type, const GLvoid *pixels )
3110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   teximage(ctx, GL_FALSE, 1, target, level, internalFormat, width, 1, 1,
3113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            border, format, type, 0, pixels);
3114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
3119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLsizei width, GLsizei height, GLint border,
3120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLenum format, GLenum type,
3121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  const GLvoid *pixels )
3122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   teximage(ctx, GL_FALSE, 2, target, level, internalFormat, width, height, 1,
3125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            border, format, type, 0, pixels);
3126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
3130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by the API or display list executor.
3131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that width and height include the border.
3132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
3133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
3135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLsizei width, GLsizei height, GLsizei depth,
3136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLint border, GLenum format, GLenum type,
3137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  const GLvoid *pixels )
3138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   teximage(ctx, GL_FALSE, 3, target, level, internalFormat,
3141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            width, height, depth,
3142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            border, format, type, 0, pixels);
3143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalFormat,
3148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLsizei width, GLsizei height, GLsizei depth,
3149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint border, GLenum format, GLenum type,
3150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const GLvoid *pixels )
3151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_TexImage3D(target, level, (GLint) internalFormat, width, height,
3153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    depth, border, format, type, pixels);
3154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_OES_EGL_image
3158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_EGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image)
3160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *texObj;
3162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_image *texImage;
3163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool valid_target;
3164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
3168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
3169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      valid_target = ctx->Extensions.OES_EGL_image;
3170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
3171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_EXTERNAL_OES:
3172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      valid_target = ctx->Extensions.OES_EGL_image_external;
3173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
3174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
3175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      valid_target = false;
3176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
3177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!valid_target) {
3180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM,
3181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  "glEGLImageTargetTexture2D(target=%d)", target);
3182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
3183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->NewState & _NEW_PIXEL)
3186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_update_state(ctx);
3187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texObj = _mesa_get_current_tex_object(ctx, target);
3189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_lock_texture(ctx, texObj);
3190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (texObj->Immutable) {
3192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
3193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  "glEGLImageTargetTexture2D(texture is immutable)");
3194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_unlock_texture(ctx, texObj);
3195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
3196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texImage = _mesa_get_tex_image(ctx, texObj, target, 0);
3199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!texImage) {
3200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glEGLImageTargetTexture2D");
3201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
3202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.FreeTextureImageBuffer(ctx, texImage);
3203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.EGLImageTargetTexture2D(ctx, target,
3205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  texObj, texImage, image);
3206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_dirty_texobj(ctx, texObj, GL_TRUE);
3208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_unlock_texture(ctx, texObj);
3210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
3213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
3217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Implement all the glTexSubImage1/2/3D() functions.
3218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
3219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
3220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtexsubimage(struct gl_context *ctx, GLuint dims, GLenum target, GLint level,
3221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint xoffset, GLint yoffset, GLint zoffset,
3222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLsizei width, GLsizei height, GLsizei depth,
3223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLenum format, GLenum type, const GLvoid *pixels )
3224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *texObj;
3226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_image *texImage;
3227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
3231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glTexSubImage%uD %s %d %d %d %d %d %d %d %s %s %p\n",
3232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dims,
3233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(target), level,
3234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  xoffset, yoffset, zoffset, width, height, depth,
3235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(format),
3236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(type), pixels);
3237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check target (proxies not allowed) */
3239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!legal_texsubimage_target(ctx, dims, target)) {
3240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glTexSubImage%uD(target=%s)",
3241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dims, _mesa_lookup_enum_by_nr(target));
3242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
3243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->NewState & _NEW_PIXEL)
3246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_update_state(ctx);
3247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (subtexture_error_check(ctx, dims, target, level, xoffset, yoffset, zoffset,
3249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              width, height, depth, format, type)) {
3250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;   /* error was detected */
3251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texObj = _mesa_get_current_tex_object(ctx, target);
3254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_lock_texture(ctx, texObj);
3256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
3257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texImage = _mesa_select_tex_image(ctx, texObj, target, level);
3258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (subtexture_error_check2(ctx, dims, target, level,
3260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  xoffset, yoffset, zoffset,
3261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  width, height, depth,
3262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  format, type, texImage)) {
3263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* error was recorded */
3264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (width > 0 && height > 0 && depth > 0) {
3266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* If we have a border, offset=-1 is legal.  Bias by border width. */
3267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (dims) {
3268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 3:
3269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (target != GL_TEXTURE_2D_ARRAY)
3270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               zoffset += texImage->Border;
3271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* fall-through */
3272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 2:
3273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (target != GL_TEXTURE_1D_ARRAY)
3274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               yoffset += texImage->Border;
3275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* fall-through */
3276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 1:
3277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            xoffset += texImage->Border;
3278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.TexSubImage(ctx, dims, texImage,
3281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 xoffset, yoffset, zoffset,
3282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 width, height, depth,
3283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 format, type, pixels, &ctx->Unpack);
3284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         check_gen_mipmap(ctx, target, texObj, level);
3286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->NewState |= _NEW_TEXTURE;
3288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_unlock_texture(ctx, texObj);
3291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexSubImage1D( GLenum target, GLint level,
3296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint xoffset, GLsizei width,
3297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLenum format, GLenum type,
3298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const GLvoid *pixels )
3299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texsubimage(ctx, 1, target, level,
3302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               xoffset, 0, 0,
3303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               width, 1, 1,
3304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format, type, pixels);
3305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexSubImage2D( GLenum target, GLint level,
3310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint xoffset, GLint yoffset,
3311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLsizei width, GLsizei height,
3312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLenum format, GLenum type,
3313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const GLvoid *pixels )
3314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texsubimage(ctx, 2, target, level,
3317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               xoffset, yoffset, 0,
3318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               width, height, 1,
3319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format, type, pixels);
3320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexSubImage3D( GLenum target, GLint level,
3326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint xoffset, GLint yoffset, GLint zoffset,
3327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLsizei width, GLsizei height, GLsizei depth,
3328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLenum format, GLenum type,
3329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const GLvoid *pixels )
3330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texsubimage(ctx, 3, target, level,
3333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               xoffset, yoffset, zoffset,
3334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               width, height, depth,
3335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format, type, pixels);
3336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
3341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For glCopyTexSubImage, return the source renderbuffer to copy texel data
3342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * from.  This depends on whether the texture contains color or depth values.
3343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
3344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_renderbuffer *
3345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_copy_tex_image_source(struct gl_context *ctx, gl_format texFormat)
3346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_get_format_bits(texFormat, GL_DEPTH_BITS) > 0) {
3348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* reading from depth/stencil buffer */
3349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ctx->ReadBuffer->Attachment[BUFFER_DEPTH].Renderbuffer;
3350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* copying from color buffer */
3353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ctx->ReadBuffer->_ColorReadBuffer;
3354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
3360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Implement the glCopyTexImage1/2D() functions.
3361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
3362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
3363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopyteximage(struct gl_context *ctx, GLuint dims,
3364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             GLenum target, GLint level, GLenum internalFormat,
3365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             GLint x, GLint y, GLsizei width, GLsizei height, GLint border )
3366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *texObj;
3368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_image *texImage;
3369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint face = _mesa_tex_target_to_face(target);
3370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
3374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glCopyTexImage%uD %s %d %s %d %d %d %d %d\n",
3375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dims,
3376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(target), level,
3377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(internalFormat),
3378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  x, y, width, height, border);
3379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->NewState & NEW_COPY_TEX_STATE)
3381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_update_state(ctx);
3382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (copytexture_error_check(ctx, dims, target, level, internalFormat,
3384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               width, height, border))
3385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
3386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texObj = _mesa_get_current_tex_object(ctx, target);
3388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (border && ctx->Const.StripTextureBorder) {
3390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      x += border;
3391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      width -= border * 2;
3392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dims == 2) {
3393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 y += border;
3394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 height -= border * 2;
3395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      border = 0;
3397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_lock_texture(ctx, texObj);
3400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
3401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texImage = _mesa_get_tex_image(ctx, texObj, target, level);
3402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!texImage) {
3404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD", dims);
3405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
3407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* choose actual hw format */
3408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         gl_format texFormat = _mesa_choose_texture_format(ctx, texObj,
3409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                           target, level,
3410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                           internalFormat,
3411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                           GL_NONE, GL_NONE);
3412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (legal_texture_size(ctx, texFormat, width, height, 1)) {
3414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint srcX = x, srcY = y, dstX = 0, dstY = 0, dstZ = 0;
3415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* Free old texture image */
3417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->Driver.FreeTextureImageBuffer(ctx, texImage);
3418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_init_teximage_fields(ctx, texImage, width, height, 1,
3420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       border, internalFormat, texFormat);
3421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* Allocate texture memory (no pixel data yet) */
3423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->Driver.TexImage(ctx, dims, texImage,
3424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GL_NONE, GL_NONE,
3425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 NULL, &ctx->Unpack);
3426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (_mesa_clip_copytexsubimage(ctx, &dstX, &dstY, &srcX, &srcY,
3428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           &width, &height)) {
3429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct gl_renderbuffer *srcRb =
3430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  get_copy_tex_image_source(ctx, texImage->TexFormat);
3431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               ctx->Driver.CopyTexSubImage(ctx, dims, texImage, dstX, dstY, dstZ,
3433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           srcRb, srcX, srcY, width, height);
3434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            check_gen_mipmap(ctx, target, texObj, level);
3437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_update_fbo_texture(ctx, texObj, face, level);
3439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_dirty_texobj(ctx, texObj, GL_TRUE);
3441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
3443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* probably too large of image */
3444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD", dims);
3445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_unlock_texture(ctx, texObj);
3449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CopyTexImage1D( GLenum target, GLint level,
3455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GLenum internalFormat,
3456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GLint x, GLint y,
3457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GLsizei width, GLint border )
3458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copyteximage(ctx, 1, target, level, internalFormat, x, y, width, 1, border);
3461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat,
3467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GLint x, GLint y, GLsizei width, GLsizei height,
3468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GLint border )
3469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copyteximage(ctx, 2, target, level, internalFormat,
3472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                x, y, width, height, border);
3473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
3478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Implementation for glCopyTexSubImage1/2/3D() functions.
3479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
3480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
3481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopytexsubimage(struct gl_context *ctx, GLuint dims, GLenum target, GLint level,
3482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                GLint xoffset, GLint yoffset, GLint zoffset,
3483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                GLint x, GLint y, GLsizei width, GLsizei height)
3484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *texObj;
3486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_image *texImage;
3487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
3491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glCopyTexSubImage%uD %s %d %d %d %d %d %d %d %d\n",
3492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dims,
3493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(target),
3494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  level, xoffset, yoffset, zoffset, x, y, width, height);
3495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->NewState & NEW_COPY_TEX_STATE)
3497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_update_state(ctx);
3498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (copytexsubimage_error_check1(ctx, dims, target, level))
3500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
3501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texObj = _mesa_get_current_tex_object(ctx, target);
3503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_lock_texture(ctx, texObj);
3505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
3506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texImage = _mesa_select_tex_image(ctx, texObj, target, level);
3507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (copytexsubimage_error_check2(ctx, dims, target, level, xoffset, yoffset,
3509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       zoffset, width, height, texImage)) {
3510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* error was recored */
3511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
3513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* If we have a border, offset=-1 is legal.  Bias by border width. */
3514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (dims) {
3515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 3:
3516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (target != GL_TEXTURE_2D_ARRAY)
3517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               zoffset += texImage->Border;
3518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* fall-through */
3519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 2:
3520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (target != GL_TEXTURE_1D_ARRAY)
3521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               yoffset += texImage->Border;
3522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* fall-through */
3523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 1:
3524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            xoffset += texImage->Border;
3525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y,
3528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        &width, &height)) {
3529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            struct gl_renderbuffer *srcRb =
3530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               get_copy_tex_image_source(ctx, texImage->TexFormat);
3531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->Driver.CopyTexSubImage(ctx, dims, texImage,
3533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        xoffset, yoffset, zoffset,
3534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        srcRb, x, y, width, height);
3535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            check_gen_mipmap(ctx, target, texObj, level);
3537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->NewState |= _NEW_TEXTURE;
3539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_unlock_texture(ctx, texObj);
3543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CopyTexSubImage1D( GLenum target, GLint level,
3548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint xoffset, GLint x, GLint y, GLsizei width )
3549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copytexsubimage(ctx, 1, target, level, xoffset, 0, 0, x, y, width, 1);
3552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CopyTexSubImage2D( GLenum target, GLint level,
3558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint xoffset, GLint yoffset,
3559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint x, GLint y, GLsizei width, GLsizei height )
3560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copytexsubimage(ctx, 2, target, level, xoffset, yoffset, 0, x, y,
3563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   width, height);
3564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CopyTexSubImage3D( GLenum target, GLint level,
3570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint xoffset, GLint yoffset, GLint zoffset,
3571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint x, GLint y, GLsizei width, GLsizei height )
3572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copytexsubimage(ctx, 3, target, level, xoffset, yoffset, zoffset,
3575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   x, y, width, height);
3576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
3582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/******                   Compressed Textures                    ******/
3583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
3584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
3587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Error checking for glCompressedTexSubImage[123]D().
3588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \warning  There are some bad assumptions here about the size of compressed
3589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *           texture tiles (multiple of 4) used to test the validity of the
3590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *           offset and size parameters.
3591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return error code or GL_NO_ERROR.
3592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
3593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum
3594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressed_subtexture_error_check(struct gl_context *ctx, GLint dimensions,
3595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  GLenum target, GLint level,
3596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  GLint xoffset, GLint yoffset, GLint zoffset,
3597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  GLsizei width, GLsizei height, GLsizei depth,
3598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  GLenum format, GLsizei imageSize)
3599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint expectedSize, maxLevels = 0, maxTextureSize;
3601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint bw, bh;
3602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) zoffset;
3603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dimensions == 1) {
3605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* 1D compressed textures not allowed */
3606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_ENUM;
3607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (dimensions == 2) {
3609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (target == GL_PROXY_TEXTURE_2D) {
3610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         maxLevels = ctx->Const.MaxTextureLevels;
3611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (target == GL_TEXTURE_2D) {
3613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         maxLevels = ctx->Const.MaxTextureLevels;
3614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) {
3616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!ctx->Extensions.ARB_texture_cube_map)
3617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_INVALID_ENUM; /*target*/
3618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         maxLevels = ctx->Const.MaxCubeTextureLevels;
3619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (_mesa_is_cube_face(target)) {
3621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!ctx->Extensions.ARB_texture_cube_map)
3622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_INVALID_ENUM; /*target*/
3623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         maxLevels = ctx->Const.MaxCubeTextureLevels;
3624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
3626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_INVALID_ENUM; /*target*/
3627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (dimensions == 3) {
3630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* 3D compressed textures not allowed */
3631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_ENUM;
3632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   maxTextureSize = 1 << (maxLevels - 1);
3635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* this will catch any invalid compressed format token */
3637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_is_compressed_format(ctx, format))
3638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_ENUM;
3639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (width < 0 || width > maxTextureSize)
3641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_VALUE;
3642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((height < 0 || height > maxTextureSize)
3644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       && dimensions > 1)
3645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_VALUE;
3646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (level < 0 || level >= maxLevels)
3648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_VALUE;
3649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
3651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * do checks which depend on compression block size
3652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
3653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   get_compressed_block_size(format, &bw, &bh);
3654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((xoffset % bw != 0) || (yoffset % bh != 0))
3656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_OPERATION;
3657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((width % bw != 0) && width != 2 && width != 1)
3659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_OPERATION;
3660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((height % bh != 0) && height != 2 && height != 1)
3662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_OPERATION;
3663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   expectedSize = compressed_tex_size(width, height, depth, format);
3665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (expectedSize != imageSize)
3666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_VALUE;
3667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_NO_ERROR;
3669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
3673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do second part of glCompressedTexSubImage error checking.
3674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if error found, GL_FALSE otherwise.
3675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
3676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressed_subtexture_error_check2(struct gl_context *ctx, GLuint dims,
3678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   GLsizei width, GLsizei height,
3679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   GLsizei depth, GLenum format,
3680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   struct gl_texture_image *texImage)
3681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!texImage) {
3683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
3684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCompressedTexSubImage%uD(undefined image level)", dims);
3685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
3686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((GLint) format != texImage->InternalFormat) {
3689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
3690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCompressedTexSubImage%uD(format=0x%x)", dims, format);
3691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
3692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (compressedteximage_only_format(ctx, format)) {
3695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
3696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCompressedTexSubImage%uD(format=0x%x cannot be updated)"
3697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  , dims, format);
3698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
3699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (((width == 1 || width == 2) &&
3702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        width != (GLsizei) texImage->Width) ||
3703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (width > (GLsizei) texImage->Width)) {
3704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
3705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glCompressedTexSubImage%uD(width=%d)", dims, width);
3706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
3707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dims >= 2) {
3710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (((height == 1 || height == 2) &&
3711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           height != (GLsizei) texImage->Height) ||
3712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (height > (GLsizei) texImage->Height)) {
3713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
3714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCompressedTexSubImage%uD(height=%d)", dims, height);
3715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
3716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dims >= 3) {
3720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (((depth == 1 || depth == 2) &&
3721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           depth != (GLsizei) texImage->Depth) ||
3722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (depth > (GLsizei) texImage->Depth)) {
3723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE,
3724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "glCompressedTexSubImage%uD(depth=%d)", dims, depth);
3725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
3726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_FALSE;
3730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexImage1DARB(GLenum target, GLint level,
3735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLenum internalFormat, GLsizei width,
3736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLint border, GLsizei imageSize,
3737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              const GLvoid *data)
3738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   teximage(ctx, GL_TRUE, 1, target, level, internalFormat,
3741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            width, 1, 1, border, GL_NONE, GL_NONE, imageSize, data);
3742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexImage2DARB(GLenum target, GLint level,
3747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLenum internalFormat, GLsizei width,
3748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLsizei height, GLint border, GLsizei imageSize,
3749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              const GLvoid *data)
3750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   teximage(ctx, GL_TRUE, 2, target, level, internalFormat,
3753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            width, height, 1, border, GL_NONE, GL_NONE, imageSize, data);
3754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexImage3DARB(GLenum target, GLint level,
3759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLenum internalFormat, GLsizei width,
3760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLsizei height, GLsizei depth, GLint border,
3761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLsizei imageSize, const GLvoid *data)
3762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   teximage(ctx, GL_TRUE, 3, target, level, internalFormat,
3765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            width, height, depth, border, GL_NONE, GL_NONE, imageSize, data);
3766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
3770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Common helper for glCompressedTexSubImage1/2/3D().
3771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
3772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
3773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressed_tex_sub_image(GLuint dims, GLenum target, GLint level,
3774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint xoffset, GLint yoffset, GLint zoffset,
3775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLsizei width, GLsizei height, GLsizei depth,
3776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLenum format, GLsizei imageSize, const GLvoid *data)
3777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *texObj;
3779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_image *texImage;
3780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum error;
3781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
3782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   error = compressed_subtexture_error_check(ctx, dims, target, level,
3785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             xoffset, 0, 0, /* pos */
3786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             width, height, depth,   /* size */
3787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             format, imageSize);
3788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (error) {
3789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, error, "glCompressedTexSubImage%uD", dims);
3790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
3791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texObj = _mesa_get_current_tex_object(ctx, target);
3794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_lock_texture(ctx, texObj);
3796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
3797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texImage = _mesa_select_tex_image(ctx, texObj, target, level);
3798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (compressed_subtexture_error_check2(ctx, dims, width, height, depth,
3800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             format, texImage)) {
3801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* error was recorded */
3802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (width > 0 && height > 0 && depth > 0) {
3804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.CompressedTexSubImage(ctx, dims, texImage,
3805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           xoffset, yoffset, zoffset,
3806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           width, height, depth,
3807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           format, imageSize, data);
3808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         check_gen_mipmap(ctx, target, texObj, level);
3810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->NewState |= _NEW_TEXTURE;
3812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_unlock_texture(ctx, texObj);
3815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset,
3820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GLsizei width, GLenum format,
3821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GLsizei imageSize, const GLvoid *data)
3822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   compressed_tex_sub_image(1, target, level, xoffset, 0, 0, width, 1, 1,
3824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            format, imageSize, data);
3825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset,
3830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GLint yoffset, GLsizei width, GLsizei height,
3831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GLenum format, GLsizei imageSize,
3832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 const GLvoid *data)
3833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   compressed_tex_sub_image(2, target, level, xoffset, yoffset, 0,
3835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            width, height, 1, format, imageSize, data);
3836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
3840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset,
3841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GLint yoffset, GLint zoffset, GLsizei width,
3842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GLsizei height, GLsizei depth, GLenum format,
3843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GLsizei imageSize, const GLvoid *data)
3844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   compressed_tex_sub_image(3, target, level, xoffset, yoffset, zoffset,
3846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            width, height, depth, format, imageSize, data);
3847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic gl_format
3850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_texbuffer_format(const struct gl_context *ctx, GLenum internalFormat)
3851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (internalFormat) {
3853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA8:
3854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_A8;
3855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA16:
3856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_A16;
3857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA16F_ARB:
3858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_ALPHA_FLOAT16;
3859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA32F_ARB:
3860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_ALPHA_FLOAT32;
3861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA8I_EXT:
3862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_ALPHA_INT8;
3863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA16I_EXT:
3864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_ALPHA_INT16;
3865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA32I_EXT:
3866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_ALPHA_INT32;
3867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA8UI_EXT:
3868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_ALPHA_UINT8;
3869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA16UI_EXT:
3870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_ALPHA_UINT16;
3871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA32UI_EXT:
3872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_ALPHA_UINT32;
3873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE8:
3874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_L8;
3875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE16:
3876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_L16;
3877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE16F_ARB:
3878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_FLOAT16;
3879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE32F_ARB:
3880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_FLOAT32;
3881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE8I_EXT:
3882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_INT8;
3883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE16I_EXT:
3884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_INT16;
3885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE32I_EXT:
3886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_INT32;
3887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE8UI_EXT:
3888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_UINT8;
3889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE16UI_EXT:
3890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_UINT16;
3891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE32UI_EXT:
3892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_UINT32;
3893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE8_ALPHA8:
3894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_AL88;
3895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE16_ALPHA16:
3896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_AL1616;
3897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA16F_ARB:
3898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
3899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA32F_ARB:
3900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
3901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA8I_EXT:
3902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_ALPHA_INT8;
3903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA16I_EXT:
3904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_ALPHA_INT8;
3905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA32I_EXT:
3906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_ALPHA_INT16;
3907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA8UI_EXT:
3908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_ALPHA_UINT8;
3909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA16UI_EXT:
3910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_ALPHA_UINT16;
3911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA32UI_EXT:
3912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_LUMINANCE_ALPHA_UINT32;
3913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY8:
3914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_I8;
3915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY16:
3916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_I16;
3917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY16F_ARB:
3918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_INTENSITY_FLOAT16;
3919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY32F_ARB:
3920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_INTENSITY_FLOAT32;
3921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY8I_EXT:
3922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_INTENSITY_INT8;
3923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY16I_EXT:
3924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_INTENSITY_INT16;
3925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY32I_EXT:
3926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_INTENSITY_INT32;
3927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY8UI_EXT:
3928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_INTENSITY_UINT8;
3929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY16UI_EXT:
3930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_INTENSITY_UINT16;
3931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY32UI_EXT:
3932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_INTENSITY_UINT32;
3933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA8:
3934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RGBA8888_REV;
3935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA16:
3936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RGBA_16;
3937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA16F_ARB:
3938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RGBA_FLOAT16;
3939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA32F_ARB:
3940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RGBA_FLOAT32;
3941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA8I_EXT:
3942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RGBA_INT8;
3943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA16I_EXT:
3944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RGBA_INT16;
3945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA32I_EXT:
3946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RGBA_INT32;
3947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA8UI_EXT:
3948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RGBA_UINT8;
3949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA16UI_EXT:
3950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RGBA_UINT16;
3951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA32UI_EXT:
3952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RGBA_UINT32;
3953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG8:
3955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_GR88;
3956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG16:
3957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RG1616;
3958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG16F:
3959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RG_FLOAT16;
3960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG32F:
3961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RG_FLOAT32;
3962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG8I:
3963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RG_INT8;
3964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG16I:
3965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RG_INT16;
3966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG32I:
3967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RG_INT32;
3968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG8UI:
3969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RG_UINT8;
3970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG16UI:
3971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RG_UINT16;
3972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG32UI:
3973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_RG_UINT32;
3974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R8:
3976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_R8;
3977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R16:
3978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_R16;
3979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R16F:
3980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_R_FLOAT16;
3981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R32F:
3982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_R_FLOAT32;
3983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R8I:
3984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_R_INT8;
3985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R16I:
3986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_R_INT16;
3987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R32I:
3988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_R_INT32;
3989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R8UI:
3990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_R_UINT8;
3991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R16UI:
3992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_R_UINT16;
3993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R32UI:
3994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_R_UINT32;
3995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
3997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_NONE;
3998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic gl_format
4002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvalidate_texbuffer_format(const struct gl_context *ctx, GLenum internalFormat)
4003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format format = get_texbuffer_format(ctx, internalFormat);
4005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum datatype;
4006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (format == MESA_FORMAT_NONE)
4008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_NONE;
4009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   datatype = _mesa_get_format_datatype(format);
4011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (datatype == GL_FLOAT && !ctx->Extensions.ARB_texture_float)
4012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_NONE;
4013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (datatype == GL_HALF_FLOAT && !ctx->Extensions.ARB_half_float_pixel)
4015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MESA_FORMAT_NONE;
4016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The GL_ARB_texture_rg and GL_ARB_texture_buffer_object specs don't make
4018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * any mention of R/RG formats, but they appear in the GL 3.1 core
4019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * specification.
4020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
4021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Version <= 30) {
4022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum base_format = _mesa_get_format_base_format(format);
4023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (base_format == GL_R || base_format == GL_RG)
4025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return MESA_FORMAT_NONE;
4026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return format;
4028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** GL_ARB_texture_buffer_object */
4032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
4033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexBuffer(GLenum target, GLenum internalFormat, GLuint buffer)
4034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *texObj;
4036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_buffer_object *bufObj;
4037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format format;
4038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
4040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
4041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!(ctx->Extensions.ARB_texture_buffer_object
4043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         && _mesa_is_desktop_gl(ctx))) {
4044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBuffer");
4045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (target != GL_TEXTURE_BUFFER_ARB) {
4049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glTexBuffer(target)");
4050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format = validate_texbuffer_format(ctx, internalFormat);
4054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (format == MESA_FORMAT_NONE) {
4055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glTexBuffer(internalFormat 0x%x)",
4056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  internalFormat);
4057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bufObj = _mesa_lookup_bufferobj(ctx, buffer);
4061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (buffer && !bufObj) {
4062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBuffer(buffer %u)", buffer);
4063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texObj = _mesa_get_current_tex_object(ctx, target);
4067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_lock_texture(ctx, texObj);
4069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
4070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_reference_buffer_object(ctx, &texObj->BufferObject, bufObj);
4071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texObj->BufferObjectFormat = internalFormat;
4072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texObj->_BufferObjectFormat = format;
4073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_unlock_texture(ctx, texObj);
4075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4076