teximage.c revision d4a38e86d4b4d66cca20ee63222f940cb73fa709
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2120d71a45cfda1edfa8cd6b1732e209eb98b53d8Brian Paul * Mesa 3-D graphics library
35e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
49f6022d0567dc1288888212d7128acc48795b306Brian * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
580684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
26add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul/**
27add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul * \file teximage.c
2877ee31930a1b0cc7766939415f4f04ed6a1fa4acBrian Paul * Texture image-related functions.
29add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul */
30add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul
31add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul
32fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
33b46712ca9d379d9c091f5543500088d82cf9776cBrian Paul#include "bufferobj.h"
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
35d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora#include "enums.h"
3634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul#include "fbobject.h"
3734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul#include "framebuffer.h"
382897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul#include "hash.h"
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "image.h"
403c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
41ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h"
42db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h"
43fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul#include "state.h"
4489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h"
45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "teximage.h"
46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "texstate.h"
477179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg#include "texpal.h"
485e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
514cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul/**
5263f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul * State changes which we care about for glCopyTex[Sub]Image() calls.
5363f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul * In particular, we care about pixel transfer state and buffer state
5463f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul * (such as glReadBuffer to make sure we read from the right renderbuffer).
5563f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul */
567ecb61c30c4984a8513b306b640f9d274d8ecf61Brian Paul#define NEW_COPY_TEX_STATE (_NEW_BUFFERS | _NEW_PIXEL)
5763f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul
5863f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul
5963f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul
6063f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul/**
611749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * Return the simple base format for a given internal texture format.
621749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * For example, given GL_LUMINANCE12_ALPHA4, return GL_LUMINANCE_ALPHA.
636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
651749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * \param internalFormat the internal texture format token or 1, 2, 3, or 4.
666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the corresponding \u base internal format (GL_ALPHA, GL_LUMINANCE,
686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA), or -1 if invalid enum.
6989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
7089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the format which is used during texture application (i.e. the
7189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * texture format and env mode determine the arithmetic used.
7273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul *
7373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * XXX this could be static
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
75b132e8da5e5f2b7da1f2141e0322e66bb0608e02Brian PaulGLint
76f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
781749a25ca889d514889b34cf6311c8014d97bf66Brian Paul   switch (internalFormat) {
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_ALPHA:
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_ALPHA4:
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_ALPHA8:
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_ALPHA12:
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_ALPHA16:
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return GL_ALPHA;
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case 1:
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE:
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE4:
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE8:
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE12:
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE16:
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return GL_LUMINANCE;
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case 2:
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE_ALPHA:
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE4_ALPHA4:
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE6_ALPHA2:
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE8_ALPHA8:
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE12_ALPHA4:
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE12_ALPHA12:
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_LUMINANCE16_ALPHA16:
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return GL_LUMINANCE_ALPHA;
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_INTENSITY:
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_INTENSITY4:
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_INTENSITY8:
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_INTENSITY12:
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_INTENSITY16:
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return GL_INTENSITY;
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case 3:
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGB:
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_R3_G3_B2:
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGB4:
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGB5:
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGB8:
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGB10:
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGB12:
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGB16:
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return GL_RGB;
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case 4:
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGBA:
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGBA2:
120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGBA4:
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGB5_A1:
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGBA8:
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGB10_A2:
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGBA12:
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RGBA16:
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return GL_RGBA;
127f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      default:
128f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         ; /* fallthrough */
129f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
130f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
13129386d1f2d60e905d63f4c5f045ff3794b2ff99cIan Romanick   /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0).
13229386d1f2d60e905d63f4c5f045ff3794b2ff99cIan Romanick    */
13329386d1f2d60e905d63f4c5f045ff3794b2ff99cIan Romanick   if (ctx->API != API_OPENGL) {
134f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke      switch (internalFormat) {
13529386d1f2d60e905d63f4c5f045ff3794b2ff99cIan Romanick         case GL_BGRA:
136f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke            return GL_RGBA;
137f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke         default:
138f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke            ; /* fallthrough */
139f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke      }
140f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke   }
141f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke
1424741dbcbbc2514de370a760f4b78a17491014555Ian Romanick   if (ctx->Extensions.ARB_depth_texture) {
143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      switch (internalFormat) {
144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_DEPTH_COMPONENT:
1454741dbcbbc2514de370a760f4b78a17491014555Ian Romanick         case GL_DEPTH_COMPONENT16:
1464741dbcbbc2514de370a760f4b78a17491014555Ian Romanick         case GL_DEPTH_COMPONENT24:
1474741dbcbbc2514de370a760f4b78a17491014555Ian Romanick         case GL_DEPTH_COMPONENT32:
148f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul            return GL_DEPTH_COMPONENT;
149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         default:
150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            ; /* fallthrough */
151f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
15389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
15433fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick   switch (internalFormat) {
15533fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick   case GL_COMPRESSED_ALPHA:
15633fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick      return GL_ALPHA;
15733fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick   case GL_COMPRESSED_LUMINANCE:
15833fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick      return GL_LUMINANCE;
15933fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick   case GL_COMPRESSED_LUMINANCE_ALPHA:
16033fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick      return GL_LUMINANCE_ALPHA;
16133fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick   case GL_COMPRESSED_INTENSITY:
16233fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick      return GL_INTENSITY;
16333fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick   case GL_COMPRESSED_RGB:
16433fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick      return GL_RGB;
16533fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick   case GL_COMPRESSED_RGBA:
16633fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick      return GL_RGBA;
16733fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick   default:
16833fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick      ; /* fallthrough */
169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
171f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (ctx->Extensions.TDFX_texture_compression_FXT1) {
172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      switch (internalFormat) {
173f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_COMPRESSED_RGB_FXT1_3DFX:
17489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul            return GL_RGB;
175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_COMPRESSED_RGBA_FXT1_3DFX:
17689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul            return GL_RGBA;
177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         default:
178f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            ; /* fallthrough */
179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
180f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
182f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (ctx->Extensions.EXT_texture_compression_s3tc) {
183f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      switch (internalFormat) {
1848f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul         case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1858f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul            return GL_RGB;
186f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
187f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
188f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
18940bd9d0b190e11d39350d1b08d2c2b28e3040bcaDaniel Borca            return GL_RGBA;
190f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         default:
191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            ; /* fallthrough */
192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
193f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
194f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (ctx->Extensions.S3_s3tc) {
196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      switch (internalFormat) {
197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_RGB_S3TC:
198f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_RGB4_S3TC:
199663a9e1b7ef7b8384abe2f81e1a8749b942f6d3aDaniel Borca            return GL_RGB;
200f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_RGBA_S3TC:
201f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_RGBA4_S3TC:
202663a9e1b7ef7b8384abe2f81e1a8749b942f6d3aDaniel Borca            return GL_RGBA;
203f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         default:
204f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            ; /* fallthrough */
205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
206f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
20789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
208f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (ctx->Extensions.MESA_ycbcr_texture) {
209f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (internalFormat == GL_YCBCR_MESA)
210f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_YCBCR_MESA;
211f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2121749a25ca889d514889b34cf6311c8014d97bf66Brian Paul
213f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (ctx->Extensions.ARB_texture_float) {
214f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      switch (internalFormat) {
215f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_ALPHA16F_ARB:
216f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_ALPHA32F_ARB:
217f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            return GL_ALPHA;
218f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_RGBA16F_ARB:
219f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_RGBA32F_ARB:
220f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            return GL_RGBA;
221f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_RGB16F_ARB:
222f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_RGB32F_ARB:
223f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            return GL_RGB;
224f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_INTENSITY16F_ARB:
225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_INTENSITY32F_ARB:
226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            return GL_INTENSITY;
227f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_LUMINANCE16F_ARB:
228f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_LUMINANCE32F_ARB:
229f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            return GL_LUMINANCE;
230f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_LUMINANCE_ALPHA16F_ARB:
231f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         case GL_LUMINANCE_ALPHA32F_ARB:
232f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            return GL_LUMINANCE_ALPHA;
233f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         default:
2348f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul            ; /* fallthrough */
235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
237f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
238114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   if (ctx->Extensions.ATI_envmap_bumpmap) {
239114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      switch (internalFormat) {
240114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         case GL_DUDV_ATI:
241114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         case GL_DU8DV8_ATI:
242114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            return GL_DUDV_ATI;
243114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         default:
244114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            ; /* fallthrough */
245114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
246114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
247114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2480be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák   if (ctx->Extensions.EXT_texture_snorm) {
249c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      switch (internalFormat) {
2500be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_RED_SNORM:
2510be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_R8_SNORM:
2520be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_R16_SNORM:
2530be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák            return GL_RED;
2540be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_RG_SNORM:
2550be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_RG8_SNORM:
2560be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_RG16_SNORM:
2570be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák            return GL_RG;
2580be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_RGB_SNORM:
2590be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_RGB8_SNORM:
2600be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_RGB16_SNORM:
2610be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák            return GL_RGB;
262c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         case GL_RGBA_SNORM:
263c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         case GL_RGBA8_SNORM:
2640be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_RGBA16_SNORM:
265c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            return GL_RGBA;
2660be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_ALPHA_SNORM:
2670be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_ALPHA8_SNORM:
2680be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_ALPHA16_SNORM:
2690be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák            return GL_ALPHA;
2700be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_LUMINANCE_SNORM:
2710be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_LUMINANCE8_SNORM:
2720be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_LUMINANCE16_SNORM:
2730be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák            return GL_LUMINANCE;
2740be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_LUMINANCE_ALPHA_SNORM:
2750be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_LUMINANCE8_ALPHA8_SNORM:
2760be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_LUMINANCE16_ALPHA16_SNORM:
2770be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák            return GL_LUMINANCE_ALPHA;
2780be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_INTENSITY_SNORM:
2790be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_INTENSITY8_SNORM:
2800be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák         case GL_INTENSITY16_SNORM:
2810be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák            return GL_INTENSITY;
282c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         default:
283c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            ; /* fallthrough */
284c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      }
285c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
286114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2871ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul   if (ctx->Extensions.EXT_packed_depth_stencil) {
2881ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      switch (internalFormat) {
2891ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul         case GL_DEPTH_STENCIL_EXT:
2901ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul         case GL_DEPTH24_STENCIL8_EXT:
2911ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            return GL_DEPTH_STENCIL_EXT;
2921ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul         default:
2931ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            ; /* fallthrough */
2941ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      }
2951ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul   }
2961ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul
2970a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#if FEATURE_EXT_texture_sRGB
2980a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul   if (ctx->Extensions.EXT_texture_sRGB) {
2990a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      switch (internalFormat) {
3000a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_SRGB_EXT:
3010a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_SRGB8_EXT:
3020a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_COMPRESSED_SRGB_EXT:
3030a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
3040a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul         return GL_RGB;
3050a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_SRGB_ALPHA_EXT:
3060a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_SRGB8_ALPHA8_EXT:
3070a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_COMPRESSED_SRGB_ALPHA_EXT:
3080a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
3090a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
3100a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
3110a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul         return GL_RGBA;
3120a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_SLUMINANCE_ALPHA_EXT:
3130a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_SLUMINANCE8_ALPHA8_EXT:
3140a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
3150a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul         return GL_LUMINANCE_ALPHA;
3160a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_SLUMINANCE_EXT:
3170a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      case GL_SLUMINANCE8_EXT:
3183488b14a047bf1f05831b3bbdc374a0da482212cEric Anholt      case GL_COMPRESSED_SLUMINANCE_EXT:
3190a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul         return GL_LUMINANCE;
3200a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      default:
321abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         ; /* fallthrough */
3220a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul      }
3230a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul   }
3240a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#endif /* FEATURE_EXT_texture_sRGB */
3250a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul
326abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   if (ctx->Extensions.EXT_texture_integer) {
327abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      switch (internalFormat) {
328abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGBA8UI_EXT:
329abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGBA16UI_EXT:
330abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGBA32UI_EXT:
331abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGBA8I_EXT:
332abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGBA16I_EXT:
333abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGBA32I_EXT:
334f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      case GL_RGB10_A2UI:
335abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_RGBA;
336abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGB8UI_EXT:
337abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGB16UI_EXT:
338abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGB32UI_EXT:
339abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGB8I_EXT:
340abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGB16I_EXT:
341abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGB32I_EXT:
342abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_RGB;
343abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_ALPHA8UI_EXT:
344abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_ALPHA16UI_EXT:
345abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_ALPHA32UI_EXT:
346abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_ALPHA8I_EXT:
347abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_ALPHA16I_EXT:
348abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_ALPHA32I_EXT:
349abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_ALPHA;
350abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_INTENSITY8UI_EXT:
351abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_INTENSITY16UI_EXT:
352abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_INTENSITY32UI_EXT:
353abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_INTENSITY8I_EXT:
354abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_INTENSITY16I_EXT:
355abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_INTENSITY32I_EXT:
356abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_INTENSITY;
357abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE8UI_EXT:
358abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE16UI_EXT:
359abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE32UI_EXT:
360abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE8I_EXT:
361abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE16I_EXT:
362abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE32I_EXT:
363abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_LUMINANCE;
364abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE_ALPHA8UI_EXT:
365abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE_ALPHA16UI_EXT:
366abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE_ALPHA32UI_EXT:
367abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE_ALPHA8I_EXT:
368abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE_ALPHA16I_EXT:
369abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE_ALPHA32I_EXT:
370abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_LUMINANCE_ALPHA;
371abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      default:
372abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         ; /* fallthrough */
373abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3746988f65e43297ae63bbce30bf882f870b370096cBrian Paul   }
3756988f65e43297ae63bbce30bf882f870b370096cBrian Paul
3766988f65e43297ae63bbce30bf882f870b370096cBrian Paul   if (ctx->Extensions.ARB_texture_rg) {
3776988f65e43297ae63bbce30bf882f870b370096cBrian Paul      switch (internalFormat) {
3786988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_R16F:
3793ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 /* R16F depends on both ARB_half_float_pixel and ARB_texture_float.
3803ebbc176f9200ac954d461758937e755220ac551Ian Romanick	  */
3813ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 if (!ctx->Extensions.ARB_half_float_pixel)
3823ebbc176f9200ac954d461758937e755220ac551Ian Romanick	    break;
3833ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 /* FALLTHROUGH */
3846988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_R32F:
3853ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 if (!ctx->Extensions.ARB_texture_float)
3863ebbc176f9200ac954d461758937e755220ac551Ian Romanick	    break;
3873ebbc176f9200ac954d461758937e755220ac551Ian Romanick         return GL_RED;
3886988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_R8I:
3896988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_R8UI:
3906988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_R16I:
3916988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_R16UI:
3926988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_R32I:
3936988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_R32UI:
3943ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 if (!ctx->Extensions.EXT_texture_integer)
3953ebbc176f9200ac954d461758937e755220ac551Ian Romanick	    break;
3963ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 /* FALLTHROUGH */
3973ebbc176f9200ac954d461758937e755220ac551Ian Romanick      case GL_R8:
3983ebbc176f9200ac954d461758937e755220ac551Ian Romanick      case GL_R16:
3993ebbc176f9200ac954d461758937e755220ac551Ian Romanick      case GL_RED:
4003ebbc176f9200ac954d461758937e755220ac551Ian Romanick      case GL_COMPRESSED_RED:
4013ebbc176f9200ac954d461758937e755220ac551Ian Romanick         return GL_RED;
4023ebbc176f9200ac954d461758937e755220ac551Ian Romanick
4036988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_RG16F:
4043ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 /* RG16F depends on both ARB_half_float_pixel and ARB_texture_float.
4053ebbc176f9200ac954d461758937e755220ac551Ian Romanick	  */
4063ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 if (!ctx->Extensions.ARB_half_float_pixel)
4073ebbc176f9200ac954d461758937e755220ac551Ian Romanick	    break;
4083ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 /* FALLTHROUGH */
4096988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_RG32F:
4103ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 if (!ctx->Extensions.ARB_texture_float)
4113ebbc176f9200ac954d461758937e755220ac551Ian Romanick	    break;
4123ebbc176f9200ac954d461758937e755220ac551Ian Romanick         return GL_RG;
4136988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_RG8I:
4146988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_RG8UI:
4156988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_RG16I:
4166988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_RG16UI:
4176988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_RG32I:
4186988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_RG32UI:
4193ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 if (!ctx->Extensions.EXT_texture_integer)
4203ebbc176f9200ac954d461758937e755220ac551Ian Romanick	    break;
4213ebbc176f9200ac954d461758937e755220ac551Ian Romanick	 /* FALLTHROUGH */
4223ebbc176f9200ac954d461758937e755220ac551Ian Romanick      case GL_RG:
4233ebbc176f9200ac954d461758937e755220ac551Ian Romanick      case GL_RG8:
4243ebbc176f9200ac954d461758937e755220ac551Ian Romanick      case GL_RG16:
4253ebbc176f9200ac954d461758937e755220ac551Ian Romanick      case GL_COMPRESSED_RG:
4266988f65e43297ae63bbce30bf882f870b370096cBrian Paul         return GL_RG;
4276988f65e43297ae63bbce30bf882f870b370096cBrian Paul      default:
4286988f65e43297ae63bbce30bf882f870b370096cBrian Paul         ; /* fallthrough */
4296988f65e43297ae63bbce30bf882f870b370096cBrian Paul      }
4306988f65e43297ae63bbce30bf882f870b370096cBrian Paul   }
4316988f65e43297ae63bbce30bf882f870b370096cBrian Paul
4326988f65e43297ae63bbce30bf882f870b370096cBrian Paul   if (ctx->Extensions.EXT_texture_shared_exponent) {
4336988f65e43297ae63bbce30bf882f870b370096cBrian Paul      switch (internalFormat) {
4346988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_RGB9_E5_EXT:
4356988f65e43297ae63bbce30bf882f870b370096cBrian Paul         return GL_RGB;
4366988f65e43297ae63bbce30bf882f870b370096cBrian Paul      default:
4376988f65e43297ae63bbce30bf882f870b370096cBrian Paul         ; /* fallthrough */
4386988f65e43297ae63bbce30bf882f870b370096cBrian Paul      }
4396988f65e43297ae63bbce30bf882f870b370096cBrian Paul   }
4406988f65e43297ae63bbce30bf882f870b370096cBrian Paul
4416988f65e43297ae63bbce30bf882f870b370096cBrian Paul   if (ctx->Extensions.EXT_packed_float) {
4426988f65e43297ae63bbce30bf882f870b370096cBrian Paul      switch (internalFormat) {
4436988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_R11F_G11F_B10F_EXT:
4446988f65e43297ae63bbce30bf882f870b370096cBrian Paul         return GL_RGB;
4456988f65e43297ae63bbce30bf882f870b370096cBrian Paul      default:
4466988f65e43297ae63bbce30bf882f870b370096cBrian Paul         ; /* fallthrough */
4476988f65e43297ae63bbce30bf882f870b370096cBrian Paul      }
4486988f65e43297ae63bbce30bf882f870b370096cBrian Paul   }
4496988f65e43297ae63bbce30bf882f870b370096cBrian Paul
4506988f65e43297ae63bbce30bf882f870b370096cBrian Paul   if (ctx->Extensions.ARB_depth_buffer_float) {
4516988f65e43297ae63bbce30bf882f870b370096cBrian Paul      switch (internalFormat) {
4526988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_DEPTH_COMPONENT32F:
4536988f65e43297ae63bbce30bf882f870b370096cBrian Paul         return GL_DEPTH_COMPONENT;
4546988f65e43297ae63bbce30bf882f870b370096cBrian Paul      case GL_DEPTH32F_STENCIL8:
4556988f65e43297ae63bbce30bf882f870b370096cBrian Paul         return GL_DEPTH_STENCIL;
4566988f65e43297ae63bbce30bf882f870b370096cBrian Paul      default:
4576988f65e43297ae63bbce30bf882f870b370096cBrian Paul         ; /* fallthrough */
4586988f65e43297ae63bbce30bf882f870b370096cBrian Paul      }
4596988f65e43297ae63bbce30bf882f870b370096cBrian Paul   }
4606988f65e43297ae63bbce30bf882f870b370096cBrian Paul
461e2a054b70cb5dace40fc1426cbf936366dc72fb9Ian Romanick   if (ctx->Extensions.ARB_texture_compression_rgtc) {
4626988f65e43297ae63bbce30bf882f870b370096cBrian Paul      switch (internalFormat) {
463e2a054b70cb5dace40fc1426cbf936366dc72fb9Ian Romanick      case GL_COMPRESSED_RED_RGTC1:
464e2a054b70cb5dace40fc1426cbf936366dc72fb9Ian Romanick      case GL_COMPRESSED_SIGNED_RED_RGTC1:
4656988f65e43297ae63bbce30bf882f870b370096cBrian Paul         return GL_RED;
466e2a054b70cb5dace40fc1426cbf936366dc72fb9Ian Romanick      case GL_COMPRESSED_RG_RGTC2:
467e2a054b70cb5dace40fc1426cbf936366dc72fb9Ian Romanick      case GL_COMPRESSED_SIGNED_RG_RGTC2:
4686988f65e43297ae63bbce30bf882f870b370096cBrian Paul         return GL_RG;
4696988f65e43297ae63bbce30bf882f870b370096cBrian Paul      default:
4706988f65e43297ae63bbce30bf882f870b370096cBrian Paul         ; /* fallthrough */
4716988f65e43297ae63bbce30bf882f870b370096cBrian Paul      }
472abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
473abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
4747d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   if (ctx->Extensions.EXT_texture_compression_latc) {
4757d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      switch (internalFormat) {
4767d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
4777d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
4787d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák         return GL_LUMINANCE;
4797d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
4807d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
4817d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák         return GL_LUMINANCE_ALPHA;
4827d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      default:
4837d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák         ; /* fallthrough */
4847d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      }
4857d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   }
4867d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák
48769f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák   if (ctx->Extensions.ATI_texture_compression_3dc) {
48869f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák      switch (internalFormat) {
48969f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák      case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
49069f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák         return GL_LUMINANCE_ALPHA;
49169f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák      default:
49269f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák         ; /* fallthrough */
49369f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák      }
49469f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák   }
49569f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák
496d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu   if (ctx->Extensions.OES_compressed_ETC1_RGB8_texture) {
497d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      switch (internalFormat) {
498d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      case GL_ETC1_RGB8_OES:
499d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu         return GL_RGB;
500d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      default:
501d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu         ; /* fallthrough */
502d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      }
503d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu   }
504d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu
505fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick   if (ctx->API == API_OPENGLES) {
506fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      switch (internalFormat) {
507fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      case GL_PALETTE4_RGB8_OES:
508fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      case GL_PALETTE4_R5_G6_B5_OES:
509fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      case GL_PALETTE8_RGB8_OES:
510fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      case GL_PALETTE8_R5_G6_B5_OES:
511fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick	 return GL_RGB;
512fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      case GL_PALETTE4_RGBA8_OES:
513fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      case GL_PALETTE8_RGB5_A1_OES:
514fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      case GL_PALETTE4_RGBA4_OES:
515fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      case GL_PALETTE4_RGB5_A1_OES:
516fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      case GL_PALETTE8_RGBA8_OES:
517fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      case GL_PALETTE8_RGBA4_OES:
518fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick	 return GL_RGBA;
519fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      default:
520fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick         ; /* fallthrough */
521fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick      }
522fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick   }
523fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick
524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return -1; /* error */
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
529e93243f8b7d43695654a36334c8cc5cea140d23cBrian * For cube map faces, return a face index in [0,5].
530e93243f8b7d43695654a36334c8cc5cea140d23cBrian * For other targets return 0;
531e93243f8b7d43695654a36334c8cc5cea140d23cBrian */
532e93243f8b7d43695654a36334c8cc5cea140d23cBrianGLuint
533e93243f8b7d43695654a36334c8cc5cea140d23cBrian_mesa_tex_target_to_face(GLenum target)
534519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul{
5352efa3d4f9fd1e1683c5366d402d8740ecfb688e5Brian Paul   if (_mesa_is_cube_face(target))
536519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul      return (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
537519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul   else
538519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul      return 0;
539519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul}
540519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul
541519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul
542519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul
5436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
5448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Store a gl_texture_image pointer in a gl_texture_object structure
5458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * according to the target and level parameters.
5466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param tObj texture object.
5486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target.
5496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level.
5506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texImage texture image.
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
5523893e638e6521b9c070e01c0b31d22754ff97a88Brian Paulvoid
5533893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul_mesa_set_tex_image(struct gl_texture_object *tObj,
5543893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul                    GLenum target, GLint level,
5553893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul                    struct gl_texture_image *texImage)
556fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul{
5579c9a9abd7b953ec9b6cfc52c2f6981c5d38b1691Brian Paul   const GLuint face = _mesa_tex_target_to_face(target);
5589c9a9abd7b953ec9b6cfc52c2f6981c5d38b1691Brian Paul
559fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul   ASSERT(tObj);
560fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul   ASSERT(texImage);
5610c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu   if (target == GL_TEXTURE_RECTANGLE_NV || target == GL_TEXTURE_EXTERNAL_OES)
5620c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu      assert(level == 0);
5639c9a9abd7b953ec9b6cfc52c2f6981c5d38b1691Brian Paul
5649c9a9abd7b953ec9b6cfc52c2f6981c5d38b1691Brian Paul   tObj->Image[face][level] = texImage;
5659c9a9abd7b953ec9b6cfc52c2f6981c5d38b1691Brian Paul
566a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   /* Set the 'back' pointer */
567a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   texImage->TexObject = tObj;
568a231d245514b43cf547ccb996b68efc0186e6821Brian Paul   texImage->Level = level;
569a231d245514b43cf547ccb996b68efc0186e6821Brian Paul   texImage->Face = face;
570fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul}
571fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul
572fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul
573a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/**
5746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Allocate a texture image structure.
5756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
576a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Called via ctx->Driver.NewTextureImage() unless overriden by a device
577a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * driver.
5786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return a pointer to gl_texture_image struct with all fields initialized to
5806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * zero.
58177ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul */
58277ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paulstruct gl_texture_image *
583f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_new_texture_image( struct gl_context *ctx )
58477ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul{
585a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   (void) ctx;
58677ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul   return CALLOC_STRUCT(gl_texture_image);
58777ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul}
58877ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul
58977ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul
590a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/**
591146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul * Free a gl_texture_image and associated data.
592146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul * This function is a fallback called via ctx->Driver.DeleteTextureImage().
5936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5941eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param texImage texture image.
5956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5963e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell * Free the texture image structure and the associated image data.
597a3f137094cd965d27e1b088499dd609b81a91906Brian Paul */
59877ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paulvoid
5993c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul_mesa_delete_texture_image(struct gl_context *ctx,
6003c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul                           struct gl_texture_image *texImage)
60177ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul{
6025ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   /* Free texImage->Data and/or any other driver-specific texture
6035ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell    * image storage.
6045ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell    */
6050bb29949ba8a9e5a15dc0640dbb0a4e7990a1d57Eric Anholt   ASSERT(ctx->Driver.FreeTextureImageBuffer);
6060bb29949ba8a9e5a15dc0640dbb0a4e7990a1d57Eric Anholt   ctx->Driver.FreeTextureImageBuffer( ctx, texImage );
60777ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul}
60877ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul
60977ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul
6106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
6116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test if a target is a proxy target.
6126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
6136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target.
6146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
6156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if the target is a proxy target, GL_FALSE otherwise.
616aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul */
61777ee31930a1b0cc7766939415f4f04ed6a1fa4acBrian PaulGLboolean
61877ee31930a1b0cc7766939415f4f04ed6a1fa4acBrian Paul_mesa_is_proxy_texture(GLenum target)
619aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul{
6200c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu   /*
6210c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu    * NUM_TEXTURE_TARGETS should match number of terms below, except there's no
6220c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu    * proxy for GL_TEXTURE_BUFFER and GL_TEXTURE_EXTERNAL_OES.
623874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul    */
6240c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu   assert(NUM_TEXTURE_TARGETS == 7 + 2);
6252465c4fa9cabe8c40e526b9e081de3b70c851455Brian Paul
6268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   return (target == GL_PROXY_TEXTURE_1D ||
6278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul           target == GL_PROXY_TEXTURE_2D ||
6288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul           target == GL_PROXY_TEXTURE_3D ||
62927f4484fb73ac7bf4f790ca2d3efd50b6bea25c3Brian Paul           target == GL_PROXY_TEXTURE_CUBE_MAP_ARB ||
630bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick           target == GL_PROXY_TEXTURE_RECTANGLE_NV ||
631bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick           target == GL_PROXY_TEXTURE_1D_ARRAY_EXT ||
632bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick           target == GL_PROXY_TEXTURE_2D_ARRAY_EXT);
633aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul}
634aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul
635aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul
6366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
63735f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul * Return the proxy target which corresponds to the given texture target
63835f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul */
63935f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paulstatic GLenum
64035f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paulget_proxy_target(GLenum target)
64135f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul{
64235f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   switch (target) {
64335f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_1D:
64435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_PROXY_TEXTURE_1D:
64535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul      return GL_PROXY_TEXTURE_1D;
64635f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_2D:
64735f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_PROXY_TEXTURE_2D:
64835f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul      return GL_PROXY_TEXTURE_2D;
64935f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_3D:
65035f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_PROXY_TEXTURE_3D:
65135f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul      return GL_PROXY_TEXTURE_3D;
65235f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
65335f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
65435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
65535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
65635f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
65735f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
65835f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_CUBE_MAP_ARB:
65935f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
66035f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul      return GL_PROXY_TEXTURE_CUBE_MAP_ARB;
66135f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_RECTANGLE_NV:
66235f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_PROXY_TEXTURE_RECTANGLE_NV:
66335f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul      return GL_PROXY_TEXTURE_RECTANGLE_NV;
66435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_1D_ARRAY_EXT:
66535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
66635f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul      return GL_PROXY_TEXTURE_1D_ARRAY_EXT;
66735f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_TEXTURE_2D_ARRAY_EXT:
66835f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
66935f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul      return GL_PROXY_TEXTURE_2D_ARRAY_EXT;
67035f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   default:
67135f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul      _mesa_problem(NULL, "unexpected target in get_proxy_target()");
67235f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul      return 0;
67335f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   }
67435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul}
67535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul
67635f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul
67735f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul/**
6783c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * Get the texture object that corresponds to the target of the given
679120d71a45cfda1edfa8cd6b1732e209eb98b53d8Brian Paul * texture unit.  The target should have already been checked for validity.
6806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
6816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
6826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texUnit texture unit.
6836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target.
6846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
6856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return pointer to the texture object on success, or NULL on failure.
68635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul */
68735d5301a54153930ee6fd60dff1010ce9f901397Brian Paulstruct gl_texture_object *
6883c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul_mesa_select_tex_object(struct gl_context *ctx,
6893c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul                        const struct gl_texture_unit *texUnit,
69035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul                        GLenum target)
69135d5301a54153930ee6fd60dff1010ce9f901397Brian Paul{
692f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul   const GLboolean arrayTex = (ctx->Extensions.MESA_texture_array ||
693f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul                               ctx->Extensions.EXT_texture_array);
694f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul
69535d5301a54153930ee6fd60dff1010ce9f901397Brian Paul   switch (target) {
69635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_TEXTURE_1D:
6979818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul         return texUnit->CurrentTex[TEXTURE_1D_INDEX];
69835d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_PROXY_TEXTURE_1D:
699fe469007037d9d5cdbe1677d8ff7368b276e9e7cBrian         return ctx->Texture.ProxyTex[TEXTURE_1D_INDEX];
70035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_TEXTURE_2D:
7019818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul         return texUnit->CurrentTex[TEXTURE_2D_INDEX];
70235d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_PROXY_TEXTURE_2D:
703fe469007037d9d5cdbe1677d8ff7368b276e9e7cBrian         return ctx->Texture.ProxyTex[TEXTURE_2D_INDEX];
70435d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_TEXTURE_3D:
7059818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul         return texUnit->CurrentTex[TEXTURE_3D_INDEX];
70635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_PROXY_TEXTURE_3D:
707fe469007037d9d5cdbe1677d8ff7368b276e9e7cBrian         return ctx->Texture.ProxyTex[TEXTURE_3D_INDEX];
70835d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
70935d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
71035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
71135d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
71235d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
71335d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
7145ff4075a6961b26042dc2d7f4adcf333439823f4Brian Paul      case GL_TEXTURE_CUBE_MAP_ARB:
715a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell         return ctx->Extensions.ARB_texture_cube_map
7169818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul                ? texUnit->CurrentTex[TEXTURE_CUBE_INDEX] : NULL;
71735d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
718a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell         return ctx->Extensions.ARB_texture_cube_map
719fe469007037d9d5cdbe1677d8ff7368b276e9e7cBrian                ? ctx->Texture.ProxyTex[TEXTURE_CUBE_INDEX] : NULL;
7208afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul      case GL_TEXTURE_RECTANGLE_NV:
7218afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul         return ctx->Extensions.NV_texture_rectangle
7229818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul                ? texUnit->CurrentTex[TEXTURE_RECT_INDEX] : NULL;
7238afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul      case GL_PROXY_TEXTURE_RECTANGLE_NV:
7248afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul         return ctx->Extensions.NV_texture_rectangle
725fe469007037d9d5cdbe1677d8ff7368b276e9e7cBrian                ? ctx->Texture.ProxyTex[TEXTURE_RECT_INDEX] : NULL;
726bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      case GL_TEXTURE_1D_ARRAY_EXT:
727f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul         return arrayTex ? texUnit->CurrentTex[TEXTURE_1D_ARRAY_INDEX] : NULL;
728bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
729f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul         return arrayTex ? ctx->Texture.ProxyTex[TEXTURE_1D_ARRAY_INDEX] : NULL;
730bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      case GL_TEXTURE_2D_ARRAY_EXT:
731f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul         return arrayTex ? texUnit->CurrentTex[TEXTURE_2D_ARRAY_INDEX] : NULL;
732bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
733f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul         return arrayTex ? ctx->Texture.ProxyTex[TEXTURE_2D_ARRAY_INDEX] : NULL;
734874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      case GL_TEXTURE_BUFFER:
735874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul         return ctx->Extensions.ARB_texture_buffer_object
736874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul            ? texUnit->CurrentTex[TEXTURE_BUFFER_INDEX] : NULL;
7370c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu      case GL_TEXTURE_EXTERNAL_OES:
7380c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu         return ctx->Extensions.OES_EGL_image_external
7390c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu            ? texUnit->CurrentTex[TEXTURE_EXTERNAL_INDEX] : NULL;
74035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul      default:
74108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad target in _mesa_select_tex_object()");
74235d5301a54153930ee6fd60dff1010ce9f901397Brian Paul         return NULL;
74335d5301a54153930ee6fd60dff1010ce9f901397Brian Paul   }
74435d5301a54153930ee6fd60dff1010ce9f901397Brian Paul}
74535d5301a54153930ee6fd60dff1010ce9f901397Brian Paul
74635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul
7476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
748b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul * Return pointer to texture object for given target on current texture unit.
749b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul */
750b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paulstruct gl_texture_object *
751f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_get_current_tex_object(struct gl_context *ctx, GLenum target)
752b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul{
753b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul   struct gl_texture_unit *texUnit = _mesa_get_current_tex_unit(ctx);
754b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul   return _mesa_select_tex_object(ctx, texUnit, target);
755b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul}
756b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul
757b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul
758b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul/**
759c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul * Get a texture image pointer from a texture object, given a texture
760c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul * target and mipmap level.  The target and level parameters should
761c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul * have already been error-checked.
7626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
7636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
7641eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param texObj texture unit.
7656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target.
7666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level.
7676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
768c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul * \return pointer to the texture image structure, or NULL on failure.
769fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul */
770fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paulstruct gl_texture_image *
7713c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul_mesa_select_tex_image(struct gl_context *ctx,
7723c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul                       const struct gl_texture_object *texObj,
7735ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell		       GLenum target, GLint level)
774fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul{
775c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul   const GLuint face = _mesa_tex_target_to_face(target);
7765ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
777c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul   ASSERT(texObj);
778c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul   ASSERT(level >= 0);
779c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul   ASSERT(level < MAX_TEXTURE_LEVELS);
780bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick
781c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul   return texObj->Image[face][level];
782fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul}
783fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul
784fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul
785a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/**
786a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Like _mesa_select_tex_image() but if the image doesn't exist, allocate
787a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * it and install it.  Only return NULL if passed a bad parameter or run
788a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * out of memory.
789a3f137094cd965d27e1b088499dd609b81a91906Brian Paul */
790a3f137094cd965d27e1b088499dd609b81a91906Brian Paulstruct gl_texture_image *
791f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_get_tex_image(struct gl_context *ctx, struct gl_texture_object *texObj,
792a3f137094cd965d27e1b088499dd609b81a91906Brian Paul                    GLenum target, GLint level)
793a3f137094cd965d27e1b088499dd609b81a91906Brian Paul{
794a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   struct gl_texture_image *texImage;
7955ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
7965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   if (!texObj)
7975ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      return NULL;
7985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
7995ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   texImage = _mesa_select_tex_image(ctx, texObj, target, level);
800a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   if (!texImage) {
801a3f137094cd965d27e1b088499dd609b81a91906Brian Paul      texImage = ctx->Driver.NewTextureImage(ctx);
802a3f137094cd965d27e1b088499dd609b81a91906Brian Paul      if (!texImage) {
803a3f137094cd965d27e1b088499dd609b81a91906Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "texture image allocation");
804a3f137094cd965d27e1b088499dd609b81a91906Brian Paul         return NULL;
805a3f137094cd965d27e1b088499dd609b81a91906Brian Paul      }
8065ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
807a3f137094cd965d27e1b088499dd609b81a91906Brian Paul      _mesa_set_tex_image(texObj, target, level, texImage);
808a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   }
8095ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
810a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   return texImage;
811a3f137094cd965d27e1b088499dd609b81a91906Brian Paul}
812a3f137094cd965d27e1b088499dd609b81a91906Brian Paul
813a3f137094cd965d27e1b088499dd609b81a91906Brian Paul
814a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/**
815a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Return pointer to the specified proxy texture image.
816a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Note that proxy textures are per-context, not per-texture unit.
817a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * \return pointer to texture image or NULL if invalid target, invalid
818a3f137094cd965d27e1b088499dd609b81a91906Brian Paul *         level, or out of memory.
819a3f137094cd965d27e1b088499dd609b81a91906Brian Paul */
820a3f137094cd965d27e1b088499dd609b81a91906Brian Paulstruct gl_texture_image *
821f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_get_proxy_tex_image(struct gl_context *ctx, GLenum target, GLint level)
822a3f137094cd965d27e1b088499dd609b81a91906Brian Paul{
823a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   struct gl_texture_image *texImage;
82480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul   GLuint texIndex;
825a3f137094cd965d27e1b088499dd609b81a91906Brian Paul
826a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   if (level < 0 )
827a3f137094cd965d27e1b088499dd609b81a91906Brian Paul      return NULL;
828a3f137094cd965d27e1b088499dd609b81a91906Brian Paul
829a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   switch (target) {
830a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   case GL_PROXY_TEXTURE_1D:
831a3f137094cd965d27e1b088499dd609b81a91906Brian Paul      if (level >= ctx->Const.MaxTextureLevels)
832a3f137094cd965d27e1b088499dd609b81a91906Brian Paul         return NULL;
83380684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      texIndex = TEXTURE_1D_INDEX;
83480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      break;
835a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   case GL_PROXY_TEXTURE_2D:
836a3f137094cd965d27e1b088499dd609b81a91906Brian Paul      if (level >= ctx->Const.MaxTextureLevels)
837a3f137094cd965d27e1b088499dd609b81a91906Brian Paul         return NULL;
83880684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      texIndex = TEXTURE_2D_INDEX;
83980684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      break;
840a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   case GL_PROXY_TEXTURE_3D:
841a3f137094cd965d27e1b088499dd609b81a91906Brian Paul      if (level >= ctx->Const.Max3DTextureLevels)
842a3f137094cd965d27e1b088499dd609b81a91906Brian Paul         return NULL;
84380684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      texIndex = TEXTURE_3D_INDEX;
84480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      break;
845a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   case GL_PROXY_TEXTURE_CUBE_MAP:
846a3f137094cd965d27e1b088499dd609b81a91906Brian Paul      if (level >= ctx->Const.MaxCubeTextureLevels)
847a3f137094cd965d27e1b088499dd609b81a91906Brian Paul         return NULL;
84880684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      texIndex = TEXTURE_CUBE_INDEX;
84980684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      break;
850a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   case GL_PROXY_TEXTURE_RECTANGLE_NV:
851a3f137094cd965d27e1b088499dd609b81a91906Brian Paul      if (level > 0)
852a3f137094cd965d27e1b088499dd609b81a91906Brian Paul         return NULL;
85380684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      texIndex = TEXTURE_RECT_INDEX;
85480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      break;
855bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick   case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
856bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      if (level >= ctx->Const.MaxTextureLevels)
857bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick         return NULL;
85880684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      texIndex = TEXTURE_1D_ARRAY_INDEX;
85980684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      break;
860bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
861bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      if (level >= ctx->Const.MaxTextureLevels)
862bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick         return NULL;
86380684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      texIndex = TEXTURE_2D_ARRAY_INDEX;
86480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      break;
865a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   default:
866a3f137094cd965d27e1b088499dd609b81a91906Brian Paul      return NULL;
867a3f137094cd965d27e1b088499dd609b81a91906Brian Paul   }
86880684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul
86980684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul   texImage = ctx->Texture.ProxyTex[texIndex]->Image[0][level];
87080684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul   if (!texImage) {
87180684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      texImage = ctx->Driver.NewTextureImage(ctx);
87280684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      if (!texImage) {
87380684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "proxy texture allocation");
87480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul         return NULL;
87580684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      }
87680684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      ctx->Texture.ProxyTex[texIndex]->Image[0][level] = texImage;
87780684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      /* Set the 'back' pointer */
87880684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul      texImage->TexObject = ctx->Texture.ProxyTex[texIndex];
87980684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul   }
88080684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul   return texImage;
881a3f137094cd965d27e1b088499dd609b81a91906Brian Paul}
882a3f137094cd965d27e1b088499dd609b81a91906Brian Paul
883a3f137094cd965d27e1b088499dd609b81a91906Brian Paul
8846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
8856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the maximum number of allowed mipmap levels.
8866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
8876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
8886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target.
8896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
8906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the maximum number of allowed mipmap levels for the given
8916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * texture target, or zero if passed a bad target.
8926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
8936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_constants.
894ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul */
895ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian PaulGLint
896f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_max_texture_levels(struct gl_context *ctx, GLenum target)
897ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul{
898ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   switch (target) {
899ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_TEXTURE_1D:
900ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_PROXY_TEXTURE_1D:
901ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_TEXTURE_2D:
902ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_PROXY_TEXTURE_2D:
903ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul      return ctx->Const.MaxTextureLevels;
904ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_TEXTURE_3D:
905ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_PROXY_TEXTURE_3D:
906ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul      return ctx->Const.Max3DTextureLevels;
907ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
908ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
909ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
910ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
911ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
912ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
913add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul   case GL_TEXTURE_CUBE_MAP_ARB:
914ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
915fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul      return ctx->Extensions.ARB_texture_cube_map
916fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul         ? ctx->Const.MaxCubeTextureLevels : 0;
917ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_TEXTURE_RECTANGLE_NV:
918ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   case GL_PROXY_TEXTURE_RECTANGLE_NV:
919fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul      return ctx->Extensions.NV_texture_rectangle ? 1 : 0;
920fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul   case GL_TEXTURE_1D_ARRAY_EXT:
921fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul   case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
922fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul   case GL_TEXTURE_2D_ARRAY_EXT:
923fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
924f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul      return (ctx->Extensions.MESA_texture_array ||
925f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul              ctx->Extensions.EXT_texture_array)
926fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul         ? ctx->Const.MaxTextureLevels : 0;
927874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_TEXTURE_BUFFER:
9280c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu   case GL_TEXTURE_EXTERNAL_OES:
929874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      /* fall-through */
930ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   default:
931ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul      return 0; /* bad target */
932ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul   }
933ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul}
934ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul
935ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul
93683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul/**
9375e3733fadf08178fca7c9f20a0f4783f940383aaBrian Paul * Return number of dimensions per mipmap level for the given texture target.
93883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul */
939a988ddf3798e0ec568704e4a72b46030079c7e45Dave AirlieGLint
940a988ddf3798e0ec568704e4a72b46030079c7e45Dave Airlie_mesa_get_texture_dimensions(GLenum target)
94183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul{
94283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   switch (target) {
94383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_TEXTURE_1D:
94483e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_PROXY_TEXTURE_1D:
94583e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul      return 1;
94683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_TEXTURE_2D:
94783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_TEXTURE_RECTANGLE:
94883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_TEXTURE_CUBE_MAP:
94983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_PROXY_TEXTURE_2D:
95083e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_PROXY_TEXTURE_RECTANGLE:
95183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_PROXY_TEXTURE_CUBE_MAP:
95283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
95383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
95483e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
95583e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
95683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
95783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
9585e3733fadf08178fca7c9f20a0f4783f940383aaBrian Paul   case GL_TEXTURE_1D_ARRAY:
9595e3733fadf08178fca7c9f20a0f4783f940383aaBrian Paul   case GL_PROXY_TEXTURE_1D_ARRAY:
9600c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu   case GL_TEXTURE_EXTERNAL_OES:
96183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul      return 2;
96283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_TEXTURE_3D:
96383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   case GL_PROXY_TEXTURE_3D:
9645e3733fadf08178fca7c9f20a0f4783f940383aaBrian Paul   case GL_TEXTURE_2D_ARRAY:
9655e3733fadf08178fca7c9f20a0f4783f940383aaBrian Paul   case GL_PROXY_TEXTURE_2D_ARRAY:
96683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul      return 3;
967874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_TEXTURE_BUFFER:
968874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      /* fall-through */
96983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   default:
97083e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul      _mesa_problem(NULL, "invalid target 0x%x in get_texture_dimensions()",
97183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul                    target);
97283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul      return 2;
97383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   }
97483e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul}
97583e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul
97683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul
97783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul
978fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul
97962c734f49948df7aeef55ad23a6664cbf3e11533Brian Paul#if 000 /* not used anymore */
980f93b3dd69e744cf1dd6b102a11cdb07c2df4a967Brian Paul/*
981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * glTexImage[123]D can accept a NULL image pointer.  In this case we
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * create a texture image with unspecified image contents per the OpenGL
9838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * spec.
984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
9858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulstatic GLubyte *
9868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulmake_null_texture(GLint width, GLint height, GLint depth, GLenum format)
987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
9888e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   const GLint components = _mesa_components_in_format(format);
9898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   const GLint numPixels = width * height * depth;
9908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   GLubyte *data = (GLubyte *) MALLOC(numPixels * components * sizeof(GLubyte));
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
992a1503b00f863a48a517939a42d512f9cfe77f79cBrian Paul#ifdef DEBUG
993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*
994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * Let's see if anyone finds this.  If glTexImage2D() is called with
995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * a NULL image pointer then load the texture image with something
996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * interesting instead of leaving it indeterminate.
997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
9988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   if (data) {
99965d54604c387dca986c876e811362d8e8517dcacBrian Paul      static const char message[8][32] = {
1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         "   X   X  XXXXX   XXX     X    ",
1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         "   XX XX  X      X   X   X X   ",
1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         "   X X X  X      X      X   X  ",
1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         "   X   X  XXXX    XXX   XXXXX  ",
1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         "   X   X  X          X  X   X  ",
1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         "   X   X  X      X   X  X   X  ",
1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         "   X   X  XXXXX   XXX   X   X  ",
1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         "                               "
1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      };
1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
10108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul      GLubyte *imgPtr = data;
10118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul      GLint h, i, j, k;
10128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul      for (h = 0; h < depth; h++) {
10138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul         for (i = 0; i < height; i++) {
10148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul            GLint srcRow = 7 - (i % 8);
10158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul            for (j = 0; j < width; j++) {
10168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul               GLint srcCol = j % 32;
10178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul               GLubyte texel = (message[srcRow][srcCol]=='X') ? 255 : 70;
10188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul               for (k = 0; k < components; k++) {
10198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                  *imgPtr++ = texel;
10208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul               }
1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1025a1503b00f863a48a517939a42d512f9cfe77f79cBrian Paul#endif
10268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
10278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   return data;
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
102962c734f49948df7aeef55ad23a6664cbf3e11533Brian Paul#endif
1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1033738318bb75dea8dac4465f53850987f6062a732dBrian Paul/**
1034fc144728c7e33e53f7a4a4486eb81fddff156758Brian Paul * Set the size and format-related fields of a gl_texture_image struct
1035fc144728c7e33e53f7a4a4486eb81fddff156758Brian Paul * to zero.  This is used when a proxy texture test fails.
10369c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul */
10379c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paulstatic void
1038f378ab825c0c74aab263e7dec30194eead22c288Brian Paulclear_teximage_fields(struct gl_texture_image *img)
10399c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul{
10409c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul   ASSERT(img);
1041a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul   img->_BaseFormat = 0;
1042a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul   img->InternalFormat = 0;
10439c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul   img->Border = 0;
10449c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul   img->Width = 0;
10459c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul   img->Height = 0;
10469c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul   img->Depth = 0;
10479c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul   img->Width2 = 0;
10489c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul   img->Height2 = 0;
10499c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul   img->Depth2 = 0;
10509c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul   img->WidthLog2 = 0;
10519c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul   img->HeightLog2 = 0;
10529c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul   img->DepthLog2 = 0;
10531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   img->TexFormat = MESA_FORMAT_NONE;
10549c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul}
10559c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul
10569c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul
10576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
10586628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul * Initialize basic fields of the gl_texture_image struct.
10596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
10606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
1061b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * \param target texture target (GL_TEXTURE_1D, GL_TEXTURE_RECTANGLE, etc).
10626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param img texture image structure to be initialized.
10636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width.
10646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height.
10656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param depth image depth.
10666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param border image border.
10676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param internalFormat internal format.
106883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul * \param format  the actual hardware format (one of MESA_FORMAT_*)
10696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
10706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Fills in the fields of \p img with the given information.
1071887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul * Note: width, height and depth include the border.
10726628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul */
10733893e638e6521b9c070e01c0b31d22754ff97a88Brian Paulvoid
1074f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_teximage_fields(struct gl_context *ctx, GLenum target,
10753893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul                           struct gl_texture_image *img,
10763893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul                           GLsizei width, GLsizei height, GLsizei depth,
107783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul                           GLint border, GLenum internalFormat,
107883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul                           gl_format format)
10796628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul{
10806628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul   ASSERT(img);
10818bc00c2047f69d8cd37d4fd70256850445b0fa1dBrian Paul   ASSERT(width >= 0);
10828bc00c2047f69d8cd37d4fd70256850445b0fa1dBrian Paul   ASSERT(height >= 0);
10838bc00c2047f69d8cd37d4fd70256850445b0fa1dBrian Paul   ASSERT(depth >= 0);
1084b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul
1085a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul   img->_BaseFormat = _mesa_base_tex_format( ctx, internalFormat );
1086a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul   ASSERT(img->_BaseFormat > 0);
1087a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul   img->InternalFormat = internalFormat;
10886628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul   img->Border = border;
10896628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul   img->Width = width;
10906628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul   img->Height = height;
10916628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul   img->Depth = depth;
1092c813b545ab4726fc5030f123ec6255224d64ad82Brian
10934d0b7618cb3ada3b13e9e9b650ace34f5131e318Brian Paul   img->Width2 = width - 2 * border;   /* == 1 << img->WidthLog2; */
1094b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger   img->WidthLog2 = _mesa_logbase2(img->Width2);
1095c813b545ab4726fc5030f123ec6255224d64ad82Brian
1096c813b545ab4726fc5030f123ec6255224d64ad82Brian   if (height == 1) { /* 1-D texture */
1097c813b545ab4726fc5030f123ec6255224d64ad82Brian      img->Height2 = 1;
10986628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul      img->HeightLog2 = 0;
1099c813b545ab4726fc5030f123ec6255224d64ad82Brian   }
1100c813b545ab4726fc5030f123ec6255224d64ad82Brian   else {
1101c813b545ab4726fc5030f123ec6255224d64ad82Brian      img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */
1102b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger      img->HeightLog2 = _mesa_logbase2(img->Height2);
1103c813b545ab4726fc5030f123ec6255224d64ad82Brian   }
1104c813b545ab4726fc5030f123ec6255224d64ad82Brian
1105c813b545ab4726fc5030f123ec6255224d64ad82Brian   if (depth == 1) {  /* 2-D texture */
1106c813b545ab4726fc5030f123ec6255224d64ad82Brian      img->Depth2 = 1;
11076628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul      img->DepthLog2 = 0;
1108c813b545ab4726fc5030f123ec6255224d64ad82Brian   }
1109c813b545ab4726fc5030f123ec6255224d64ad82Brian   else {
1110c813b545ab4726fc5030f123ec6255224d64ad82Brian      img->Depth2 = depth - 2 * border;   /* == 1 << img->DepthLog2; */
1111b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger      img->DepthLog2 = _mesa_logbase2(img->Depth2);
1112c813b545ab4726fc5030f123ec6255224d64ad82Brian   }
1113c813b545ab4726fc5030f123ec6255224d64ad82Brian
11146628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul   img->MaxLog2 = MAX2(img->WidthLog2, img->HeightLog2);
1115c813b545ab4726fc5030f123ec6255224d64ad82Brian
111683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   img->TexFormat = format;
11176628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul}
11186628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul
11196628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul
1120738318bb75dea8dac4465f53850987f6062a732dBrian Paul/**
112142b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * Free and clear fields of the gl_texture_image struct.
112242b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu *
112342b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * \param ctx GL context.
112442b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * \param texImage texture image structure to be cleared.
112542b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu *
112642b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * After the call, \p texImage will have no data associated with it.  Its
112742b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * fields are cleared so that its parent object will test incomplete.
112842b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu */
112942b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wuvoid
11303c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul_mesa_clear_texture_image(struct gl_context *ctx,
11313c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul                          struct gl_texture_image *texImage)
113242b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu{
11330bb29949ba8a9e5a15dc0640dbb0a4e7990a1d57Eric Anholt   ctx->Driver.FreeTextureImageBuffer(ctx, texImage);
113442b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu   clear_teximage_fields(texImage);
113542b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu}
113642b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu
113742b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu
113842b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu/**
1139738318bb75dea8dac4465f53850987f6062a732dBrian Paul * This is the fallback for Driver.TestProxyTexImage().  Test the texture
1140738318bb75dea8dac4465f53850987f6062a732dBrian Paul * level, width, height and depth against the ctx->Const limits for textures.
1141738318bb75dea8dac4465f53850987f6062a732dBrian Paul *
1142738318bb75dea8dac4465f53850987f6062a732dBrian Paul * A hardware driver might override this function if, for example, the
1143738318bb75dea8dac4465f53850987f6062a732dBrian Paul * max 3D texture size is 512x512x64 (i.e. not a cube).
1144738318bb75dea8dac4465f53850987f6062a732dBrian Paul *
1145aa328291c5b015e74ebfd9c5cdb39227265b3000Brian * Note that width, height, depth == 0 is not an error.  However, a
1146aa328291c5b015e74ebfd9c5cdb39227265b3000Brian * texture with zero width/height/depth will be considered "incomplete"
1147aa328291c5b015e74ebfd9c5cdb39227265b3000Brian * and texturing will effectively be disabled.
1148aa328291c5b015e74ebfd9c5cdb39227265b3000Brian *
1149738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param target  one of GL_PROXY_TEXTURE_1D, GL_PROXY_TEXTURE_2D,
1150738318bb75dea8dac4465f53850987f6062a732dBrian Paul *                GL_PROXY_TEXTURE_3D, GL_PROXY_TEXTURE_RECTANGLE_NV,
1151738318bb75dea8dac4465f53850987f6062a732dBrian Paul *                GL_PROXY_TEXTURE_CUBE_MAP_ARB.
1152738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param level  as passed to glTexImage
1153738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param internalFormat  as passed to glTexImage
1154738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param format  as passed to glTexImage
1155738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param type  as passed to glTexImage
1156738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param width  as passed to glTexImage
1157738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param height  as passed to glTexImage
1158738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param depth  as passed to glTexImage
1159738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param border  as passed to glTexImage
1160738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \return GL_TRUE if the image is acceptable, GL_FALSE if not acceptable.
1161738318bb75dea8dac4465f53850987f6062a732dBrian Paul */
1162738318bb75dea8dac4465f53850987f6062a732dBrian PaulGLboolean
1163f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level,
1164738318bb75dea8dac4465f53850987f6062a732dBrian Paul                          GLint internalFormat, GLenum format, GLenum type,
1165738318bb75dea8dac4465f53850987f6062a732dBrian Paul                          GLint width, GLint height, GLint depth, GLint border)
1166738318bb75dea8dac4465f53850987f6062a732dBrian Paul{
1167738318bb75dea8dac4465f53850987f6062a732dBrian Paul   GLint maxSize;
11689c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul
1169738318bb75dea8dac4465f53850987f6062a732dBrian Paul   (void) internalFormat;
1170738318bb75dea8dac4465f53850987f6062a732dBrian Paul   (void) format;
1171738318bb75dea8dac4465f53850987f6062a732dBrian Paul   (void) type;
1172738318bb75dea8dac4465f53850987f6062a732dBrian Paul
1173738318bb75dea8dac4465f53850987f6062a732dBrian Paul   switch (target) {
1174738318bb75dea8dac4465f53850987f6062a732dBrian Paul   case GL_PROXY_TEXTURE_1D:
1175738318bb75dea8dac4465f53850987f6062a732dBrian Paul      maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
1176c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (width < 2 * border || width > 2 + maxSize)
1177738318bb75dea8dac4465f53850987f6062a732dBrian Paul         return GL_FALSE;
1178c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (level >= ctx->Const.MaxTextureLevels)
1179c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1180c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1181c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1182c64447f47de168e82086bc2fb483817b82e59cabBrian Paul            return GL_FALSE;
1183738318bb75dea8dac4465f53850987f6062a732dBrian Paul      }
1184738318bb75dea8dac4465f53850987f6062a732dBrian Paul      return GL_TRUE;
1185c64447f47de168e82086bc2fb483817b82e59cabBrian Paul
1186738318bb75dea8dac4465f53850987f6062a732dBrian Paul   case GL_PROXY_TEXTURE_2D:
1187738318bb75dea8dac4465f53850987f6062a732dBrian Paul      maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
1188c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (width < 2 * border || width > 2 + maxSize)
1189c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1190c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (height < 2 * border || height > 2 + maxSize)
1191738318bb75dea8dac4465f53850987f6062a732dBrian Paul         return GL_FALSE;
1192c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (level >= ctx->Const.MaxTextureLevels)
1193c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1194c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1195c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1196c64447f47de168e82086bc2fb483817b82e59cabBrian Paul            return GL_FALSE;
1197c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         if (height > 0 && !_mesa_is_pow_two(height - 2 * border))
1198c64447f47de168e82086bc2fb483817b82e59cabBrian Paul            return GL_FALSE;
1199738318bb75dea8dac4465f53850987f6062a732dBrian Paul      }
1200738318bb75dea8dac4465f53850987f6062a732dBrian Paul      return GL_TRUE;
1201c64447f47de168e82086bc2fb483817b82e59cabBrian Paul
1202738318bb75dea8dac4465f53850987f6062a732dBrian Paul   case GL_PROXY_TEXTURE_3D:
1203738318bb75dea8dac4465f53850987f6062a732dBrian Paul      maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1);
1204c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (width < 2 * border || width > 2 + maxSize)
1205c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1206c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (height < 2 * border || height > 2 + maxSize)
1207738318bb75dea8dac4465f53850987f6062a732dBrian Paul         return GL_FALSE;
1208c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (depth < 2 * border || depth > 2 + maxSize)
1209c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1210c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (level >= ctx->Const.Max3DTextureLevels)
1211c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1212c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1213c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1214c64447f47de168e82086bc2fb483817b82e59cabBrian Paul            return GL_FALSE;
1215c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         if (height > 0 && !_mesa_is_pow_two(height - 2 * border))
1216c64447f47de168e82086bc2fb483817b82e59cabBrian Paul            return GL_FALSE;
1217c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         if (depth > 0 && !_mesa_is_pow_two(depth - 2 * border))
1218c64447f47de168e82086bc2fb483817b82e59cabBrian Paul            return GL_FALSE;
1219738318bb75dea8dac4465f53850987f6062a732dBrian Paul      }
1220738318bb75dea8dac4465f53850987f6062a732dBrian Paul      return GL_TRUE;
1221c64447f47de168e82086bc2fb483817b82e59cabBrian Paul
1222738318bb75dea8dac4465f53850987f6062a732dBrian Paul   case GL_PROXY_TEXTURE_RECTANGLE_NV:
1223c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      maxSize = ctx->Const.MaxTextureRectSize;
1224c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (width < 0 || width > maxSize)
1225c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1226c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (height < 0 || height > maxSize)
1227c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1228c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (level != 0)
1229738318bb75dea8dac4465f53850987f6062a732dBrian Paul         return GL_FALSE;
1230738318bb75dea8dac4465f53850987f6062a732dBrian Paul      return GL_TRUE;
1231c64447f47de168e82086bc2fb483817b82e59cabBrian Paul
1232738318bb75dea8dac4465f53850987f6062a732dBrian Paul   case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
1233738318bb75dea8dac4465f53850987f6062a732dBrian Paul      maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1);
1234c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (width < 2 * border || width > 2 + maxSize)
1235c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1236c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (height < 2 * border || height > 2 + maxSize)
1237c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1238c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (level >= ctx->Const.MaxCubeTextureLevels)
1239738318bb75dea8dac4465f53850987f6062a732dBrian Paul         return GL_FALSE;
1240c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1241c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1242c64447f47de168e82086bc2fb483817b82e59cabBrian Paul            return GL_FALSE;
1243c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         if (height > 0 && !_mesa_is_pow_two(height - 2 * border))
1244c64447f47de168e82086bc2fb483817b82e59cabBrian Paul            return GL_FALSE;
1245738318bb75dea8dac4465f53850987f6062a732dBrian Paul      }
1246738318bb75dea8dac4465f53850987f6062a732dBrian Paul      return GL_TRUE;
1247c64447f47de168e82086bc2fb483817b82e59cabBrian Paul
1248bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick   case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
1249bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
1250c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (width < 2 * border || width > 2 + maxSize)
1251bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick         return GL_FALSE;
1252c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (height < 1 || height > ctx->Const.MaxArrayTextureLayers)
1253bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick         return GL_FALSE;
1254c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (level >= ctx->Const.MaxTextureLevels)
1255c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1256c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1257c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1258c64447f47de168e82086bc2fb483817b82e59cabBrian Paul            return GL_FALSE;
1259bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      }
1260bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      return GL_TRUE;
1261c64447f47de168e82086bc2fb483817b82e59cabBrian Paul
1262bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
1263bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
1264c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (width < 2 * border || width > 2 + maxSize)
1265bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick         return GL_FALSE;
1266c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (height < 2 * border || height > 2 + maxSize)
1267c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1268c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (depth < 1 || depth > ctx->Const.MaxArrayTextureLayers)
1269bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick         return GL_FALSE;
1270c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (level >= ctx->Const.MaxTextureLevels)
1271c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         return GL_FALSE;
1272c64447f47de168e82086bc2fb483817b82e59cabBrian Paul      if (!ctx->Extensions.ARB_texture_non_power_of_two) {
1273c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         if (width > 0 && !_mesa_is_pow_two(width - 2 * border))
1274c64447f47de168e82086bc2fb483817b82e59cabBrian Paul            return GL_FALSE;
1275c64447f47de168e82086bc2fb483817b82e59cabBrian Paul         if (height > 0 && !_mesa_is_pow_two(height - 2 * border))
1276c64447f47de168e82086bc2fb483817b82e59cabBrian Paul            return GL_FALSE;
1277bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      }
1278bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick      return GL_TRUE;
1279c64447f47de168e82086bc2fb483817b82e59cabBrian Paul
1280738318bb75dea8dac4465f53850987f6062a732dBrian Paul   default:
1281738318bb75dea8dac4465f53850987f6062a732dBrian Paul      _mesa_problem(ctx, "Invalid target in _mesa_test_proxy_teximage");
1282738318bb75dea8dac4465f53850987f6062a732dBrian Paul      return GL_FALSE;
1283738318bb75dea8dac4465f53850987f6062a732dBrian Paul   }
1284738318bb75dea8dac4465f53850987f6062a732dBrian Paul}
1285738318bb75dea8dac4465f53850987f6062a732dBrian Paul
1286738318bb75dea8dac4465f53850987f6062a732dBrian Paul
1287738318bb75dea8dac4465f53850987f6062a732dBrian Paul/**
12884b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul * Check if the memory used by the texture would exceed the driver's limit.
12894b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul * This lets us support a max 3D texture size of 8K (for example) but
12904b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul * prevents allocating a full 8K x 8K x 8K texture.
12914b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul * XXX this could be rolled into the proxy texture size test (above) but
12924b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul * we don't have the actual texture internal format at that point.
12934b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul */
12944b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paulstatic GLboolean
12954b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paullegal_texture_size(struct gl_context *ctx, gl_format format,
12964b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul                   GLint width, GLint height, GLint depth)
12974b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul{
12984b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul   uint64_t bytes = _mesa_format_image_size64(format, width, height, depth);
12994b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul   uint64_t mbytes = bytes / (1024 * 1024); /* convert to MB */
13004b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul   return mbytes <= (uint64_t) ctx->Const.MaxTextureMbytes;
13014b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul}
13024b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul
13034b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul
1304d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu/**
1305d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu * Return true if the format is only valid for glCompressedTexImage.
1306d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu */
1307d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wustatic GLboolean
1308d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wucompressedteximage_only_format(const struct gl_context *ctx, GLenum format)
1309d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu{
1310d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu   switch (format) {
1311d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu   case GL_ETC1_RGB8_OES:
1312d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      return GL_TRUE;
1313d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu   default:
1314d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      return GL_FALSE;
1315d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu   }
1316d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu}
1317d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu
13184b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul
13194b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul/**
13207404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul * Helper function to determine whether a target and specific compression
13217404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul * format are supported.
1322064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick */
1323064cd7c78c3108012f5d15206c70470f7b500259Ian Romanickstatic GLboolean
13247404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paultarget_can_be_compressed(const struct gl_context *ctx, GLenum target,
13257404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul                         GLenum intFormat)
1326064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick{
13277404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul   (void) intFormat;  /* not used yet */
13287404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul
1329646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   switch (target) {
1330646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   case GL_TEXTURE_2D:
1331646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   case GL_PROXY_TEXTURE_2D:
13327404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      return GL_TRUE; /* true for any compressed format so far */
1333646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   case GL_PROXY_TEXTURE_CUBE_MAP:
1334646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1335646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1336646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1337646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1338646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1339646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1340646afcc34045cd482e79ded241aac23082e65f6cBrian Paul      return ctx->Extensions.ARB_texture_cube_map;
1341646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
1342646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   case GL_TEXTURE_2D_ARRAY_EXT:
1343f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul      return (ctx->Extensions.MESA_texture_array ||
1344684c66bb8b8cdaa7fc18b64a6f739ad70a10cd54Brian Paul              ctx->Extensions.EXT_texture_array);
1345646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   default:
1346646afcc34045cd482e79ded241aac23082e65f6cBrian Paul      return GL_FALSE;
1347646afcc34045cd482e79ded241aac23082e65f6cBrian Paul   }
1348064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick}
1349064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick
1350064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick
1351064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick/**
1352d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul * Check if the given texture target value is legal for a
1353d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul * glTexImage1/2/3D call.
1354d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul */
1355d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paulstatic GLboolean
1356d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paullegal_teximage_target(struct gl_context *ctx, GLuint dims, GLenum target)
1357d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul{
1358d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   switch (dims) {
1359d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   case 1:
1360d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      switch (target) {
1361d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_1D:
1362d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_PROXY_TEXTURE_1D:
1363d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         return GL_TRUE;
1364d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      default:
1365d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         return GL_FALSE;
1366d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      }
1367d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   case 2:
1368d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      switch (target) {
1369d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_2D:
1370d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_PROXY_TEXTURE_2D:
1371d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         return GL_TRUE;
1372d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_PROXY_TEXTURE_CUBE_MAP:
1373d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1374d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1375d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1376d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1377d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1378d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1379d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         return ctx->Extensions.ARB_texture_cube_map;
1380d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_RECTANGLE_NV:
1381d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_PROXY_TEXTURE_RECTANGLE_NV:
1382d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         return ctx->Extensions.NV_texture_rectangle;
1383d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_1D_ARRAY_EXT:
1384d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
1385f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul         return (ctx->Extensions.MESA_texture_array ||
1386f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul                 ctx->Extensions.EXT_texture_array);
1387d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      default:
1388d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         return GL_FALSE;
1389d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      }
1390d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   case 3:
1391d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      switch (target) {
1392d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_3D:
1393d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_PROXY_TEXTURE_3D:
1394d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         return GL_TRUE;
1395d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_TEXTURE_2D_ARRAY_EXT:
1396d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
1397f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul         return (ctx->Extensions.MESA_texture_array ||
1398f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul                 ctx->Extensions.EXT_texture_array);
1399d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      default:
1400d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         return GL_FALSE;
1401d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      }
1402d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   default:
1403d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      _mesa_problem(ctx, "invalid dims=%u in legal_teximage_target()", dims);
1404d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      return GL_FALSE;
1405d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   }
1406d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul}
1407d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul
1408d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul
1409d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul/**
141011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul * Check if the given texture target value is legal for a
141109a5e028a6d254f619132e302a96c8535018603dBrian Paul * glTexSubImage, glCopyTexSubImage or glCopyTexImage call.
141209a5e028a6d254f619132e302a96c8535018603dBrian Paul * The difference compared to legal_teximage_target() above is that
141309a5e028a6d254f619132e302a96c8535018603dBrian Paul * proxy targets are not supported.
141411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul */
141511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paulstatic GLboolean
141609a5e028a6d254f619132e302a96c8535018603dBrian Paullegal_texsubimage_target(struct gl_context *ctx, GLuint dims, GLenum target)
141711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul{
141811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   switch (dims) {
141911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   case 1:
142011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      return target == GL_TEXTURE_1D;
142111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   case 2:
142211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      switch (target) {
142311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      case GL_TEXTURE_2D:
142411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul         return GL_TRUE;
142511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
142611f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
142711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
142811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
142911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
143011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
143111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul         return ctx->Extensions.ARB_texture_cube_map;
143211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      case GL_TEXTURE_RECTANGLE_NV:
143311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul         return ctx->Extensions.NV_texture_rectangle;
143411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      case GL_TEXTURE_1D_ARRAY_EXT:
1435f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul         return (ctx->Extensions.MESA_texture_array ||
1436f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul                 ctx->Extensions.EXT_texture_array);
143711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      default:
143811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul         return GL_FALSE;
143911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      }
144009a5e028a6d254f619132e302a96c8535018603dBrian Paul   case 3:
144109a5e028a6d254f619132e302a96c8535018603dBrian Paul      switch (target) {
144209a5e028a6d254f619132e302a96c8535018603dBrian Paul      case GL_TEXTURE_3D:
144309a5e028a6d254f619132e302a96c8535018603dBrian Paul         return GL_TRUE;
144409a5e028a6d254f619132e302a96c8535018603dBrian Paul      case GL_TEXTURE_2D_ARRAY_EXT:
1445f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul         return (ctx->Extensions.MESA_texture_array ||
1446f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul                 ctx->Extensions.EXT_texture_array);
144709a5e028a6d254f619132e302a96c8535018603dBrian Paul      default:
144809a5e028a6d254f619132e302a96c8535018603dBrian Paul         return GL_FALSE;
144909a5e028a6d254f619132e302a96c8535018603dBrian Paul      }
145011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   default:
145109a5e028a6d254f619132e302a96c8535018603dBrian Paul      _mesa_problem(ctx, "invalid dims=%u in legal_texsubimage_target()",
145209a5e028a6d254f619132e302a96c8535018603dBrian Paul                    dims);
145311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      return GL_FALSE;
145411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   }
145511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul}
145611f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul
145711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul
145811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul/**
1459a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul * Helper function to determine if a texture object is mutable (in terms
1460a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul * of GL_ARB_texture_storage).
1461a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul */
1462a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paulstatic GLboolean
1463a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paulmutable_tex_object(struct gl_context *ctx, GLenum target)
1464a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul{
1465a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul   if (ctx->Extensions.ARB_texture_storage) {
1466a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul      struct gl_texture_object *texObj =
1467a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul         _mesa_get_current_tex_object(ctx, target);
1468a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul      return !texObj->Immutable;
1469a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul   }
1470a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul   return GL_TRUE;
1471a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul}
1472a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul
1473a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul
1474a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul
1475a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul/**
14766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test the glTexImage[123]D() parameters for errors.
14776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
14786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
147985288ad722aa0ad378004c523a0e1a4984e15316Brian Paul * \param dimensions texture image dimensions (must be 1, 2 or 3).
14806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user.
14816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user.
14826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param internalFormat internal format given by the user.
14836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel data format given by the user.
14846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type given by the user.
14856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width given by the user.
14866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height given by the user.
14876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param depth image depth given by the user.
14886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param border image border given by the user.
14896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
14906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors.
14916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
14926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies each of the parameters against the constants specified in
14933c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * __struct gl_contextRec::Const and the supported extensions, and according
14943c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * to the OpenGL specification.
1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean
149785288ad722aa0ad378004c523a0e1a4984e15316Brian Paultexture_error_check( struct gl_context *ctx,
149885288ad722aa0ad378004c523a0e1a4984e15316Brian Paul                     GLuint dimensions, GLenum target,
1499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     GLint level, GLint internalFormat,
1500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     GLenum format, GLenum type,
1501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     GLint width, GLint height,
1502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     GLint depth, GLint border )
1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
150435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   const GLenum proxyTarget = get_proxy_target(target);
150535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   const GLboolean isProxy = target == proxyTarget;
1506e2e4b60c7d9fc3618c0f9d7496c9ce3d5eee3ab5Ian Romanick   GLboolean sizeOK = GL_TRUE;
1507eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick   GLboolean colorFormat;
1508eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick
1509eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick   /* Even though there are no color-index textures, we still have to support
1510eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick    * uploading color-index data and remapping it to RGB via the
1511eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick    * GL_PIXEL_MAP_I_TO_[RGBA] tables.
1512eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick    */
1513eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick   const GLboolean indexFormat = (format == GL_COLOR_INDEX);
1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1515738318bb75dea8dac4465f53850987f6062a732dBrian Paul   /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */
1516738318bb75dea8dac4465f53850987f6062a732dBrian Paul   if (level < 0 || level >= MAX_TEXTURE_LEVELS) {
1517738318bb75dea8dac4465f53850987f6062a732dBrian Paul      if (!isProxy) {
1518738318bb75dea8dac4465f53850987f6062a732dBrian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
1519738318bb75dea8dac4465f53850987f6062a732dBrian Paul                     "glTexImage%dD(level=%d)", dimensions, level);
15208afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul      }
1521738318bb75dea8dac4465f53850987f6062a732dBrian Paul      return GL_TRUE;
1522738318bb75dea8dac4465f53850987f6062a732dBrian Paul   }
1523738318bb75dea8dac4465f53850987f6062a732dBrian Paul
1524738318bb75dea8dac4465f53850987f6062a732dBrian Paul   /* Check border */
1525738318bb75dea8dac4465f53850987f6062a732dBrian Paul   if (border < 0 || border > 1 ||
1526738318bb75dea8dac4465f53850987f6062a732dBrian Paul       ((target == GL_TEXTURE_RECTANGLE_NV ||
1527738318bb75dea8dac4465f53850987f6062a732dBrian Paul         target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0)) {
1528738318bb75dea8dac4465f53850987f6062a732dBrian Paul      if (!isProxy) {
1529738318bb75dea8dac4465f53850987f6062a732dBrian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
1530738318bb75dea8dac4465f53850987f6062a732dBrian Paul                     "glTexImage%dD(border=%d)", dimensions, border);
1531738318bb75dea8dac4465f53850987f6062a732dBrian Paul      }
1532738318bb75dea8dac4465f53850987f6062a732dBrian Paul      return GL_TRUE;
1533738318bb75dea8dac4465f53850987f6062a732dBrian Paul   }
1534738318bb75dea8dac4465f53850987f6062a732dBrian Paul
1535973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul   if (width < 0 || height < 0 || depth < 0) {
1536f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul      if (!isProxy) {
1537f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
1538973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul                     "glTexImage%dD(width, height or depth < 0)", dimensions);
1539f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul      }
1540f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul      return GL_TRUE;
1541f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul   }
1542f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul
154335f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   /* Do this simple check before calling the TestProxyTexImage() function */
154435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   if (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB) {
154535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul      sizeOK = (width == height);
1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1547d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul
154835f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   /*
154935f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul    * Use the proxy texture driver hook to see if the size/level/etc are
155035f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul    * legal.
155135f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul    */
155235f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul   sizeOK = sizeOK && ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level,
1553e2e4b60c7d9fc3618c0f9d7496c9ce3d5eee3ab5Ian Romanick                                                    internalFormat, format,
1554e2e4b60c7d9fc3618c0f9d7496c9ce3d5eee3ab5Ian Romanick                                                    type, width, height,
1555e2e4b60c7d9fc3618c0f9d7496c9ce3d5eee3ab5Ian Romanick                                                    depth, border);
1556738318bb75dea8dac4465f53850987f6062a732dBrian Paul   if (!sizeOK) {
1557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (!isProxy) {
15584e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
1559738318bb75dea8dac4465f53850987f6062a732dBrian Paul                     "glTexImage%dD(level=%d, width=%d, height=%d, depth=%d)",
1560738318bb75dea8dac4465f53850987f6062a732dBrian Paul                     dimensions, level, width, height, depth);
1561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
1562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
1563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1565738318bb75dea8dac4465f53850987f6062a732dBrian Paul   /* Check internalFormat */
156689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   if (_mesa_base_tex_format(ctx, internalFormat) < 0) {
1567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (!isProxy) {
15684e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
1569a71edc9455ef81a8dd5ec284e88061a585e63580Brian Paul                     "glTexImage%dD(internalFormat=%s)",
1570a71edc9455ef81a8dd5ec284e88061a585e63580Brian Paul                     dimensions, _mesa_lookup_enum_by_nr(internalFormat));
1571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
1573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1575738318bb75dea8dac4465f53850987f6062a732dBrian Paul   /* Check incoming image format and type */
1576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!_mesa_is_legal_format_and_type(ctx, format, type)) {
1577326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul      /* Normally, GL_INVALID_OPERATION is generated by a format/type
1578326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul       * mismatch (see the 1.2 spec page 94, sec 3.6.4.).  But with the
1579326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul       * GL_EXT_texture_integer extension, some combinations should generate
1580326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul       * GL_INVALID_ENUM instead (grr!).
158138f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes       */
158238f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes      if (!isProxy) {
1583326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul         GLenum error = _mesa_is_integer_format(format)
1584326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul            ? GL_INVALID_ENUM : GL_INVALID_OPERATION;
1585326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul         _mesa_error(ctx, error,
15868a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul                     "glTexImage%dD(incompatible format 0x%x, type 0x%x)",
15878a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul                     dimensions, format, type);
1588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
158938f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes      return GL_TRUE;
1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1592601df9c742939c1f77de489561fe3e1d02f49618Brian Paul   /* make sure internal format and format basically agree */
159322e442544bc451f114288f07cf9cc1584ca357a1Brian Paul   colorFormat = _mesa_is_color_format(format);
159422e442544bc451f114288f07cf9cc1584ca357a1Brian Paul   if ((_mesa_is_color_format(internalFormat) && !colorFormat && !indexFormat) ||
1595ba2a55ccd61d9fa5565640faefb64fd6fb0e70abBrian Paul       (_mesa_is_depth_format(internalFormat) != _mesa_is_depth_format(format)) ||
1596ba2a55ccd61d9fa5565640faefb64fd6fb0e70abBrian Paul       (_mesa_is_ycbcr_format(internalFormat) != _mesa_is_ycbcr_format(format)) ||
1597ba2a55ccd61d9fa5565640faefb64fd6fb0e70abBrian Paul       (_mesa_is_depthstencil_format(internalFormat) != _mesa_is_depthstencil_format(format)) ||
1598ba2a55ccd61d9fa5565640faefb64fd6fb0e70abBrian Paul       (_mesa_is_dudv_format(internalFormat) != _mesa_is_dudv_format(format))) {
1599601df9c742939c1f77de489561fe3e1d02f49618Brian Paul      if (!isProxy)
1600601df9c742939c1f77de489561fe3e1d02f49618Brian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
16018a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul                     "glTexImage%dD(incompatible internalFormat 0x%x, format 0x%x)",
16028a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul                     dimensions, internalFormat, format);
1603601df9c742939c1f77de489561fe3e1d02f49618Brian Paul      return GL_TRUE;
1604601df9c742939c1f77de489561fe3e1d02f49618Brian Paul   }
1605601df9c742939c1f77de489561fe3e1d02f49618Brian Paul
1606601df9c742939c1f77de489561fe3e1d02f49618Brian Paul   /* additional checks for ycbcr textures */
1607601df9c742939c1f77de489561fe3e1d02f49618Brian Paul   if (internalFormat == GL_YCBCR_MESA) {
1608c5b995066020191982b2315fc45d05e068eee761Brian Paul      ASSERT(ctx->Extensions.MESA_ycbcr_texture);
1609601df9c742939c1f77de489561fe3e1d02f49618Brian Paul      if (type != GL_UNSIGNED_SHORT_8_8_MESA &&
1610601df9c742939c1f77de489561fe3e1d02f49618Brian Paul          type != GL_UNSIGNED_SHORT_8_8_REV_MESA) {
1611c5b995066020191982b2315fc45d05e068eee761Brian Paul         char message[100];
1612fc1be4a99425d09103bba9e06026f31f2b0142d2Vinson Lee         _mesa_snprintf(message, sizeof(message),
16132236a301c35d29a8e0775d2b62499d8843607ee1Brian Paul                        "glTexImage%dD(format/type YCBCR mismatch", dimensions);
1614c5dde53f4e42612518cd927bb58f08c0e22db17aVinson Lee         _mesa_error(ctx, GL_INVALID_ENUM, "%s", message);
1615c5b995066020191982b2315fc45d05e068eee761Brian Paul         return GL_TRUE; /* error */
1616c5b995066020191982b2315fc45d05e068eee761Brian Paul      }
1617d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul      if (target != GL_TEXTURE_2D &&
1618d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul          target != GL_PROXY_TEXTURE_2D &&
1619d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul          target != GL_TEXTURE_RECTANGLE_NV &&
1620d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul          target != GL_PROXY_TEXTURE_RECTANGLE_NV) {
1621d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul         if (!isProxy)
1622d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul            _mesa_error(ctx, GL_INVALID_ENUM, "glTexImage(target)");
1623d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul         return GL_TRUE;
1624d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul      }
1625d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul      if (border != 0) {
1626d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul         if (!isProxy) {
1627d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul            char message[100];
1628fc1be4a99425d09103bba9e06026f31f2b0142d2Vinson Lee            _mesa_snprintf(message, sizeof(message),
16292236a301c35d29a8e0775d2b62499d8843607ee1Brian Paul                           "glTexImage%dD(format=GL_YCBCR_MESA and border=%d)",
1630fc1be4a99425d09103bba9e06026f31f2b0142d2Vinson Lee                           dimensions, border);
1631c5dde53f4e42612518cd927bb58f08c0e22db17aVinson Lee            _mesa_error(ctx, GL_INVALID_VALUE, "%s", message);
1632d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul         }
1633d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul         return GL_TRUE;
1634d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul      }
1635c5b995066020191982b2315fc45d05e068eee761Brian Paul   }
1636c5b995066020191982b2315fc45d05e068eee761Brian Paul
1637601df9c742939c1f77de489561fe3e1d02f49618Brian Paul   /* additional checks for depth textures */
1638601df9c742939c1f77de489561fe3e1d02f49618Brian Paul   if (_mesa_base_tex_format(ctx, internalFormat) == GL_DEPTH_COMPONENT) {
1639753660780a84187043d0dc4b0e0f449786862182Brian Paul      /* Only 1D, 2D, rect and array textures supported, not 3D or cubes */
1640601df9c742939c1f77de489561fe3e1d02f49618Brian Paul      if (target != GL_TEXTURE_1D &&
1641601df9c742939c1f77de489561fe3e1d02f49618Brian Paul          target != GL_PROXY_TEXTURE_1D &&
1642601df9c742939c1f77de489561fe3e1d02f49618Brian Paul          target != GL_TEXTURE_2D &&
16432b04dd9d2cba6ec3506e78016e64cffce6e8abf7Brian Paul          target != GL_PROXY_TEXTURE_2D &&
1644753660780a84187043d0dc4b0e0f449786862182Brian Paul          target != GL_TEXTURE_1D_ARRAY &&
1645753660780a84187043d0dc4b0e0f449786862182Brian Paul          target != GL_PROXY_TEXTURE_1D_ARRAY &&
1646753660780a84187043d0dc4b0e0f449786862182Brian Paul          target != GL_TEXTURE_2D_ARRAY &&
1647753660780a84187043d0dc4b0e0f449786862182Brian Paul          target != GL_PROXY_TEXTURE_2D_ARRAY &&
16482b04dd9d2cba6ec3506e78016e64cffce6e8abf7Brian Paul          target != GL_TEXTURE_RECTANGLE_ARB &&
16492b04dd9d2cba6ec3506e78016e64cffce6e8abf7Brian Paul          target != GL_PROXY_TEXTURE_RECTANGLE_ARB) {
1650601df9c742939c1f77de489561fe3e1d02f49618Brian Paul         if (!isProxy)
1651601df9c742939c1f77de489561fe3e1d02f49618Brian Paul            _mesa_error(ctx, GL_INVALID_ENUM,
1652601df9c742939c1f77de489561fe3e1d02f49618Brian Paul                        "glTexImage(target/internalFormat)");
1653601df9c742939c1f77de489561fe3e1d02f49618Brian Paul         return GL_TRUE;
1654601df9c742939c1f77de489561fe3e1d02f49618Brian Paul      }
1655601df9c742939c1f77de489561fe3e1d02f49618Brian Paul   }
1656601df9c742939c1f77de489561fe3e1d02f49618Brian Paul
1657601df9c742939c1f77de489561fe3e1d02f49618Brian Paul   /* additional checks for compressed textures */
1658c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   if (_mesa_is_compressed_format(ctx, internalFormat)) {
16597404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      if (!target_can_be_compressed(ctx, target, internalFormat)) {
16607404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul         if (!isProxy)
16617404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul            _mesa_error(ctx, GL_INVALID_ENUM,
16627404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul                        "glTexImage%dD(target)", dimensions);
1663064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick         return GL_TRUE;
166489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
1665d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      if (compressedteximage_only_format(ctx, internalFormat)) {
1666d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu         _mesa_error(ctx, GL_INVALID_OPERATION,
1667d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu               "glTexImage%dD(no compression for format)", dimensions);
1668d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu         return GL_TRUE;
1669d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      }
167089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      if (border != 0) {
167189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         if (!isProxy) {
167289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul            _mesa_error(ctx, GL_INVALID_OPERATION,
16738978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee                        "glTexImage%dD(border!=0)", dimensions);
167489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         }
167589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         return GL_TRUE;
167689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
167789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
167889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
1679326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul   /* additional checks for integer textures */
1680326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul   if (ctx->Extensions.EXT_texture_integer &&
1681326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul       (_mesa_is_integer_format(format) !=
1682326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul        _mesa_is_integer_format(internalFormat))) {
1683326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul      if (!isProxy) {
1684326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
1685326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul                     "glTexImage%dD(integer/non-integer format mismatch)",
1686326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul                     dimensions);
1687326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul      }
1688326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul      return GL_TRUE;
1689326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul   }
1690326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul
1691a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul   if (!mutable_tex_object(ctx, target)) {
1692a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION,
1693a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul                  "glTexImage%dD(immutable texture)", dimensions);
1694a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul      return GL_TRUE;
1695a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul   }
1696a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul
1697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* if we get here, the parameters are OK */
1698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return GL_FALSE;
1699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
17026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Test glTexSubImage[123]D() parameters for errors.
17046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
17056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
17066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dimensions texture image dimensions (must be 1, 2 or 3).
17076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user.
17086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user.
17096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param xoffset sub-image x offset given by the user.
17106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param yoffset sub-image y offset given by the user.
17116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param zoffset sub-image z offset given by the user.
17126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel data format given by the user.
17136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type given by the user.
17146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width given by the user.
17156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height given by the user.
17166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param depth image depth given by the user.
17176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
17186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors.
17196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
17206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies each of the parameters against the constants specified in
17213c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * __struct gl_contextRec::Const and the supported extensions, and according
17223c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * to the OpenGL specification.
1723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean
1725f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergsubtexture_error_check( struct gl_context *ctx, GLuint dimensions,
1726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                        GLenum target, GLint level,
1727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                        GLint xoffset, GLint yoffset, GLint zoffset,
1728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                        GLint width, GLint height, GLint depth,
1729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                        GLenum format, GLenum type )
1730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1731738318bb75dea8dac4465f53850987f6062a732dBrian Paul   /* Basic level check */
1732738318bb75dea8dac4465f53850987f6062a732dBrian Paul   if (level < 0 || level >= MAX_TEXTURE_LEVELS) {
17334e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glTexSubImage2D(level=%d)", level);
1734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
1735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
173745124e043da5a67e1081526d61b99422f4ccde19Brian Paul   /* Check for negative sizes */
1738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (width < 0) {
17394e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
17404e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul                  "glTexSubImage%dD(width=%d)", dimensions, width);
1741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
1742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (height < 0 && dimensions > 1) {
17444e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
17454e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul                  "glTexSubImage%dD(height=%d)", dimensions, height);
1746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
1747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (depth < 0 && dimensions > 2) {
1749738318bb75dea8dac4465f53850987f6062a732dBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
1750738318bb75dea8dac4465f53850987f6062a732dBrian Paul                  "glTexSubImage%dD(depth=%d)", dimensions, depth);
1751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
1752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
17545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   if (!_mesa_is_legal_format_and_type(ctx, format, type)) {
1755326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul      /* As with the glTexImage2D check above, the error code here
1756326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul       * depends on texture integer.
1757326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul       */
1758326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul      GLenum error = _mesa_is_integer_format(format)
1759326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul         ? GL_INVALID_OPERATION : GL_INVALID_ENUM;
1760326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul      _mesa_error(ctx, error,
17618a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul                  "glTexSubImage%dD(incompatible format 0x%x, type 0x%x)",
17628a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul                  dimensions, format, type);
17635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      return GL_TRUE;
17645ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   }
17655ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
17665ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   return GL_FALSE;
17675ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell}
1768f2718b0966f54049056e16e7cca08718341557b2Brian Paul
1769d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul
1770d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul/**
1771d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul * Do second part of glTexSubImage which depends on the destination texture.
1772d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul * \return GL_TRUE if error recorded, GL_FALSE otherwise
1773d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul */
17745ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwellstatic GLboolean
1775f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergsubtexture_error_check2( struct gl_context *ctx, GLuint dimensions,
17765ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell			 GLenum target, GLint level,
17775ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell			 GLint xoffset, GLint yoffset, GLint zoffset,
17785ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell			 GLint width, GLint height, GLint depth,
17795ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell			 GLenum format, GLenum type,
17805ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell			 const struct gl_texture_image *destTex )
17815ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell{
1782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!destTex) {
1783738318bb75dea8dac4465f53850987f6062a732dBrian Paul      /* undefined image level */
1784738318bb75dea8dac4465f53850987f6062a732dBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexSubImage%dD", dimensions);
1785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
1786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (xoffset < -((GLint)destTex->Border)) {
1789738318bb75dea8dac4465f53850987f6062a732dBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(xoffset)",
1790738318bb75dea8dac4465f53850987f6062a732dBrian Paul                  dimensions);
1791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
1792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (xoffset + width > (GLint) (destTex->Width + destTex->Border)) {
1794738318bb75dea8dac4465f53850987f6062a732dBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(xoffset+width)",
1795738318bb75dea8dac4465f53850987f6062a732dBrian Paul                  dimensions);
1796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
1797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1798c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (dimensions > 1) {
1799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (yoffset < -((GLint)destTex->Border)) {
1800738318bb75dea8dac4465f53850987f6062a732dBrian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(yoffset)",
1801738318bb75dea8dac4465f53850987f6062a732dBrian Paul                     dimensions);
1802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return GL_TRUE;
1803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (yoffset + height > (GLint) (destTex->Height + destTex->Border)) {
1805738318bb75dea8dac4465f53850987f6062a732dBrian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(yoffset+height)",
1806738318bb75dea8dac4465f53850987f6062a732dBrian Paul                     dimensions);
1807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return GL_TRUE;
1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (dimensions > 2) {
1811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (zoffset < -((GLint)destTex->Border)) {
181208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset)");
1813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return GL_TRUE;
1814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
181538f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes      if (zoffset + depth  > (GLint) (destTex->Depth + destTex->Border)) {
181608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset+depth)");
1817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return GL_TRUE;
1818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
1819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1821b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   if (_mesa_is_format_compressed(destTex->TexFormat)) {
1822d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul      GLuint bw, bh;
1823d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul
1824d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      if (compressedteximage_only_format(ctx, destTex->InternalFormat)) {
1825d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu         _mesa_error(ctx, GL_INVALID_OPERATION,
1826d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu               "glTexSubImage%dD(no compression for format)", dimensions);
1827d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu         return GL_TRUE;
1828d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      }
1829d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu
1830d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul      /* do tests which depend on compression block size */
1831d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul      _mesa_get_format_block_size(destTex->TexFormat, &bw, &bh);
1832d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul
1833d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul      /* offset must be multiple of block size */
1834d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul      if ((xoffset % bw != 0) || (yoffset % bh != 0)) {
1835e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
18368978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee                     "glTexSubImage%dD(xoffset = %d, yoffset = %d)",
1837d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul                     dimensions, xoffset, yoffset);
1838e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul         return GL_TRUE;
1839e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul      }
1840d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul      /* size must be multiple of bw by bh or equal to whole texture size */
1841d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul      if ((width % bw != 0) && (GLuint) width != destTex->Width) {
1842e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
18438978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee                     "glTexSubImage%dD(width = %d)", dimensions, width);
1844e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul         return GL_TRUE;
184589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
1846d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul      if ((height % bh != 0) && (GLuint) height != destTex->Height) {
184789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
18488978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee                     "glTexSubImage%dD(height = %d)", dimensions, height);
184989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         return GL_TRUE;
185089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
1851e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul   }
1852e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   return GL_FALSE;
1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
1855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
18576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Test glCopyTexImage[12]D() parameters for errors.
18596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
18606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
18616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dimensions texture image dimensions (must be 1, 2 or 3).
18626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user.
18636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user.
18646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param internalFormat internal format given by the user.
18656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width given by the user.
18666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height given by the user.
18676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param border texture border.
18686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
18696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors.
18706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
18716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies each of the parameters against the constants specified in
18723c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * __struct gl_contextRec::Const and the supported extensions, and according
18733c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * to the OpenGL specification.
1874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean
1876f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcopytexture_error_check( struct gl_context *ctx, GLuint dimensions,
1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum target, GLint level, GLint internalFormat,
1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLint width, GLint height, GLint border )
1879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
188011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   const GLenum proxyTarget = get_proxy_target(target);
188111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   const GLenum type = GL_FLOAT;
1882738318bb75dea8dac4465f53850987f6062a732dBrian Paul   GLboolean sizeOK;
1883e06277bd886a9a79f0bf9b175ec26fbe187689c2Brian Paul   GLint baseFormat;
1884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
188511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   /* check target */
188609a5e028a6d254f619132e302a96c8535018603dBrian Paul   if (!legal_texsubimage_target(ctx, dimensions, target)) {
188711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glCopyTexImage%uD(target=%s)",
188811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                  dimensions, _mesa_lookup_enum_by_nr(target));
188911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      return GL_TRUE;
189011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   }
189111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul
1892738318bb75dea8dac4465f53850987f6062a732dBrian Paul   /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */
1893738318bb75dea8dac4465f53850987f6062a732dBrian Paul   if (level < 0 || level >= MAX_TEXTURE_LEVELS) {
18945ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      _mesa_error(ctx, GL_INVALID_VALUE,
18955ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell                  "glCopyTexImage%dD(level=%d)", dimensions, level);
18965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      return GL_TRUE;
18975ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   }
18985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
189934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul   /* Check that the source buffer is complete */
190034bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul   if (ctx->ReadBuffer->Name) {
1901b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul      if (ctx->ReadBuffer->_Status == 0) {
1902b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul         _mesa_test_framebuffer_completeness(ctx, ctx->ReadBuffer);
1903b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul      }
190434bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul      if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
190534bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul         _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
190634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul                     "glCopyTexImage%dD(invalid readbuffer)", dimensions);
190734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul         return GL_TRUE;
190834bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul      }
190934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul   }
191034bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul
1911738318bb75dea8dac4465f53850987f6062a732dBrian Paul   /* Check border */
1912738318bb75dea8dac4465f53850987f6062a732dBrian Paul   if (border < 0 || border > 1 ||
1913738318bb75dea8dac4465f53850987f6062a732dBrian Paul       ((target == GL_TEXTURE_RECTANGLE_NV ||
1914738318bb75dea8dac4465f53850987f6062a732dBrian Paul         target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0)) {
1915738318bb75dea8dac4465f53850987f6062a732dBrian Paul      return GL_TRUE;
1916738318bb75dea8dac4465f53850987f6062a732dBrian Paul   }
1917738318bb75dea8dac4465f53850987f6062a732dBrian Paul
1918e06277bd886a9a79f0bf9b175ec26fbe187689c2Brian Paul   baseFormat = _mesa_base_tex_format(ctx, internalFormat);
1919e06277bd886a9a79f0bf9b175ec26fbe187689c2Brian Paul   if (baseFormat < 0) {
19200899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
19210899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul                  "glCopyTexImage%dD(internalFormat)", dimensions);
19220899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul      return GL_TRUE;
19230899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul   }
19240899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul
1925e06277bd886a9a79f0bf9b175ec26fbe187689c2Brian Paul   if (!_mesa_source_buffer_exists(ctx, baseFormat)) {
192634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION,
192734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul                  "glCopyTexImage%dD(missing readbuffer)", dimensions);
192834bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul      return GL_TRUE;
192934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul   }
193034bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul
193111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   /* Do size, level checking */
193211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   sizeOK = (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB)
193311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      ? (width == height) : 1;
1934738318bb75dea8dac4465f53850987f6062a732dBrian Paul
193511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   sizeOK = sizeOK && ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level,
1936e06277bd886a9a79f0bf9b175ec26fbe187689c2Brian Paul                                                    internalFormat, baseFormat,
193711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                                                    type, width, height,
193811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                                                    1, border);
1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1940738318bb75dea8dac4465f53850987f6062a732dBrian Paul   if (!sizeOK) {
1941738318bb75dea8dac4465f53850987f6062a732dBrian Paul      if (dimensions == 1) {
19424e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
1943738318bb75dea8dac4465f53850987f6062a732dBrian Paul                     "glCopyTexImage1D(width=%d)", width);
1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
1945738318bb75dea8dac4465f53850987f6062a732dBrian Paul      else {
1946738318bb75dea8dac4465f53850987f6062a732dBrian Paul         ASSERT(dimensions == 2);
1947738318bb75dea8dac4465f53850987f6062a732dBrian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
1948738318bb75dea8dac4465f53850987f6062a732dBrian Paul                     "glCopyTexImage2D(width=%d, height=%d)", width, height);
1949ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul      }
1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1953c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   if (_mesa_is_compressed_format(ctx, internalFormat)) {
19547404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      if (!target_can_be_compressed(ctx, target, internalFormat)) {
195589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         _mesa_error(ctx, GL_INVALID_ENUM,
19562236a301c35d29a8e0775d2b62499d8843607ee1Brian Paul                     "glCopyTexImage%dD(target)", dimensions);
195789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         return GL_TRUE;
195889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
1959d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      if (compressedteximage_only_format(ctx, internalFormat)) {
1960d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu         _mesa_error(ctx, GL_INVALID_OPERATION,
1961d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu               "glCopyTexImage%dD(no compression for format)", dimensions);
1962d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu         return GL_TRUE;
1963d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      }
196489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      if (border != 0) {
196589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
19668978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee                     "glCopyTexImage%dD(border!=0)", dimensions);
19670899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul         return GL_TRUE;
19680899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul      }
19690899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul   }
197089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
1971a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul   if (!mutable_tex_object(ctx, target)) {
1972a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION,
1973a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul                  "glCopyTexImage%dD(immutable texture)", dimensions);
1974a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul      return GL_TRUE;
1975a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul   }
1976a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul
1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /* if we get here, the parameters are OK */
1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   return GL_FALSE;
1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
19826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
198334bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul * Test glCopyTexSubImage[12]D() parameters for errors.
19849dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * Note that this is the first part of error checking.
19859dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * See also copytexsubimage_error_check2() below for the second part.
19866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
19876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
19886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dimensions texture image dimensions (must be 1, 2 or 3).
19896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user.
19906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user.
19916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
19926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors.
19936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean
1995f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcopytexsubimage_error_check1( struct gl_context *ctx, GLuint dimensions,
19969dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul                              GLenum target, GLint level)
1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
199834bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul   /* Check that the source buffer is complete */
199934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul   if (ctx->ReadBuffer->Name) {
2000b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul      if (ctx->ReadBuffer->_Status == 0) {
2001b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul         _mesa_test_framebuffer_completeness(ctx, ctx->ReadBuffer);
2002b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul      }
200334bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul      if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
200434bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul         _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
200534bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul                     "glCopyTexImage%dD(invalid readbuffer)", dimensions);
200634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul         return GL_TRUE;
200734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul      }
200834bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul   }
200934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul
20101c23b860cea93534f726d2a18658444f37f43538Brian Paul   /* check target (proxies not allowed) */
201109a5e028a6d254f619132e302a96c8535018603dBrian Paul   if (!legal_texsubimage_target(ctx, dimensions, target)) {
20121c23b860cea93534f726d2a18658444f37f43538Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glCopyTexSubImage%uD(target=%s)",
20131c23b860cea93534f726d2a18658444f37f43538Brian Paul                  dimensions, _mesa_lookup_enum_by_nr(target));
20141c23b860cea93534f726d2a18658444f37f43538Brian Paul      return GL_TRUE;
2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2017738318bb75dea8dac4465f53850987f6062a732dBrian Paul   /* Check level */
2018738318bb75dea8dac4465f53850987f6062a732dBrian Paul   if (level < 0 || level >= MAX_TEXTURE_LEVELS) {
20194e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
20204e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul                  "glCopyTexSubImage%dD(level=%d)", dimensions, level);
2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
20245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   return GL_FALSE;
20255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell}
20265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
20279dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul
20289dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul/**
20299dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * Second part of error checking for glCopyTexSubImage[12]D().
20309dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * \param xoffset sub-image x offset given by the user.
20319dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * \param yoffset sub-image y offset given by the user.
20329dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * \param zoffset sub-image z offset given by the user.
20339dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * \param width image width given by the user.
20349dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * \param height image height given by the user.
20359dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul */
20365ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwellstatic GLboolean
2037f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcopytexsubimage_error_check2( struct gl_context *ctx, GLuint dimensions,
20385ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell			      GLenum target, GLint level,
20395ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell			      GLint xoffset, GLint yoffset, GLint zoffset,
20405ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell			      GLsizei width, GLsizei height,
20415ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell			      const struct gl_texture_image *teximage )
20425ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell{
20439dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul   /* check that dest tex image exists */
2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!teximage) {
20454e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION,
2046b9f75444e60477e7a523e7eec1bb49a8232fd4e7Brian Paul                  "glCopyTexSubImage%dD(undefined texture level: %d)",
2047b9f75444e60477e7a523e7eec1bb49a8232fd4e7Brian Paul                  dimensions, level);
2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
20519dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul   /* Check size */
20529dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul   if (width < 0) {
20539dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
20549dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul                  "glCopyTexSubImage%dD(width=%d)", dimensions, width);
20559dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul      return GL_TRUE;
20569dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul   }
20579dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul   if (dimensions > 1 && height < 0) {
20589dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
20599dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul                  "glCopyTexSubImage%dD(height=%d)", dimensions, height);
20609dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul      return GL_TRUE;
20619dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul   }
20629dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul
20639dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul   /* check x/y offsets */
2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (xoffset < -((GLint)teximage->Border)) {
20654e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
20664e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul                  "glCopyTexSubImage%dD(xoffset=%d)", dimensions, xoffset);
2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
206938f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes   if (xoffset + width > (GLint) (teximage->Width + teximage->Border)) {
20704e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
20714e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul                  "glCopyTexSubImage%dD(xoffset+width)", dimensions);
2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return GL_TRUE;
2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (dimensions > 1) {
2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (yoffset < -((GLint)teximage->Border)) {
20764e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
20774e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul                     "glCopyTexSubImage%dD(yoffset=%d)", dimensions, yoffset);
2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return GL_TRUE;
2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* NOTE: we're adding the border here, not subtracting! */
208138f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes      if (yoffset + height > (GLint) (teximage->Height + teximage->Border)) {
20824e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
20834e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul                     "glCopyTexSubImage%dD(yoffset+height)", dimensions);
2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return GL_TRUE;
2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
20889dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul   /* check z offset */
2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (dimensions > 2) {
2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (zoffset < -((GLint)teximage->Border)) {
20914e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
20924e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul                     "glCopyTexSubImage%dD(zoffset)", dimensions);
2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return GL_TRUE;
2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
209538f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes      if (zoffset > (GLint) (teximage->Depth + teximage->Border)) {
20964e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
20974e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul                     "glCopyTexSubImage%dD(zoffset+depth)", dimensions);
2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return GL_TRUE;
2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2102b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   if (_mesa_is_format_compressed(teximage->TexFormat)) {
2103d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      if (compressedteximage_only_format(ctx, teximage->InternalFormat)) {
2104d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu         _mesa_error(ctx, GL_INVALID_OPERATION,
2105d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu               "glCopyTexSubImage%dD(no compression for format)", dimensions);
2106d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu         return GL_TRUE;
2107d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      }
210889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      /* offset must be multiple of 4 */
210989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      if ((xoffset & 3) || (yoffset & 3)) {
211089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
21118978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee                     "glCopyTexSubImage%dD(xoffset or yoffset)", dimensions);
2112e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul         return GL_TRUE;
2113e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul      }
211489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      /* size must be multiple of 4 */
2115798d83cf67098a7df293c711e0d2c8c296fc4c8fKarl Schultz      if ((width & 3) != 0 && (GLuint) width != teximage->Width) {
211689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
21178978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee                     "glCopyTexSubImage%dD(width)", dimensions);
2118e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul         return GL_TRUE;
211989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
2120798d83cf67098a7df293c711e0d2c8c296fc4c8fKarl Schultz      if ((height & 3) != 0 && (GLuint) height != teximage->Height) {
212189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
21228978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee                     "glCopyTexSubImage%dD(height)", dimensions);
212389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         return GL_TRUE;
212489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
2125e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul   }
2126e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
2127a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul   if (teximage->InternalFormat == GL_YCBCR_MESA) {
2128d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glCopyTexSubImage2D");
2129d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul      return GL_TRUE;
2130d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul   }
2131d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul
2132985a2eff82111e81f70b6dea9d9b3184dd0061d3Alan Hourihane   if (!_mesa_source_buffer_exists(ctx, teximage->_BaseFormat)) {
2133985a2eff82111e81f70b6dea9d9b3184dd0061d3Alan Hourihane      _mesa_error(ctx, GL_INVALID_OPERATION,
2134803504e69fbd85713fc6d93af21f5245852cecabBrian Paul                  "glCopyTexSubImage%dD(missing readbuffer, format=0x%x)",
2135803504e69fbd85713fc6d93af21f5245852cecabBrian Paul                  dimensions, teximage->_BaseFormat);
2136985a2eff82111e81f70b6dea9d9b3184dd0061d3Alan Hourihane      return GL_TRUE;
2137985a2eff82111e81f70b6dea9d9b3184dd0061d3Alan Hourihane   }
2138985a2eff82111e81f70b6dea9d9b3184dd0061d3Alan Hourihane
2139326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul   /* If copying into an integer texture, the source buffer must also be
2140326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul    * integer-valued.
2141326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul    */
2142412b9608838b872bc294569b3ee913343a7e66f6Brian Paul   if (_mesa_is_format_integer_color(teximage->TexFormat)) {
2143326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul      struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
2144412b9608838b872bc294569b3ee913343a7e66f6Brian Paul      if (!_mesa_is_format_integer_color(rb->Format)) {
2145326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
2146326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul                  "glCopyTexSubImage%dD(source buffer is not integer format)",
2147326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul                  dimensions);
2148326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul         return GL_TRUE;
2149326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul      }
2150326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul   }
2151326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul
2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /* if we get here, the parameters are OK */
2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   return GL_FALSE;
2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
21572897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul/** Callback info for walking over FBO hash table */
21582897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paulstruct cb_info
21592897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul{
2160f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx;
21612897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   struct gl_texture_object *texObj;
21622897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   GLuint level, face;
21632897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul};
21642897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul
21658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
2166519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul/**
21672897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul * Check render to texture callback.  Called from _mesa_HashWalk().
2168519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul */
2169519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulstatic void
21702897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paulcheck_rtt_cb(GLuint key, void *data, void *userData)
2171519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul{
21722897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   struct gl_framebuffer *fb = (struct gl_framebuffer *) data;
21732897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   const struct cb_info *info = (struct cb_info *) userData;
2174f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = info->ctx;
21752897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   const struct gl_texture_object *texObj = info->texObj;
21762897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   const GLuint level = info->level, face = info->face;
21772897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul
21782897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   /* If this is a user-created FBO */
21792897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   if (fb->Name) {
2180519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul      GLuint i;
21812897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul      /* check if any of the FBO's attachments point to 'texObj' */
2182519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul      for (i = 0; i < BUFFER_COUNT; i++) {
21832897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul         struct gl_renderbuffer_attachment *att = fb->Attachment + i;
2184519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul         if (att->Type == GL_TEXTURE &&
2185519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul             att->Texture == texObj &&
2186519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul             att->TextureLevel == level &&
2187519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul             att->CubeMapFace == face) {
2188db0f9e701d59dcfcd3b50f4d245897692f27fec9Brian Paul            ASSERT(_mesa_get_attachment_teximage(att));
2189519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul            /* Tell driver about the new renderbuffer texture */
2190ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            ctx->Driver.RenderTexture(ctx, ctx->DrawBuffer, att);
21912897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul            /* Mark fb status as indeterminate to force re-validation */
21922897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul            fb->_Status = 0;
2193519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul         }
2194519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul      }
2195519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul   }
2196519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul}
2197519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul
2198519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul
21992897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul/**
22002897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul * When a texture image is specified we have to check if it's bound to
22012897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul * any framebuffer objects (render to texture) in order to detect changes
22022897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul * in size or format since that effects FBO completeness.
22032897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul * Any FBOs rendering into the texture must be re-validated.
22042897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul */
22052897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paulstatic void
2206f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergupdate_fbo_texture(struct gl_context *ctx, struct gl_texture_object *texObj,
22072897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul                   GLuint face, GLuint level)
22082897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul{
22092897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   /* Only check this texture if it's been marked as RenderToTexture */
22102897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   if (texObj->_RenderToTexture) {
22112897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul      struct cb_info info;
22122897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul      info.ctx = ctx;
22132897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul      info.texObj = texObj;
22142897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul      info.level = level;
22152897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul      info.face = face;
22162897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul      _mesa_HashWalk(ctx->Shared->FrameBuffers, check_rtt_cb, &info);
22172897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   }
22182897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul}
22192897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul
22202897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul
22212914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul/**
22222914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul * If the texture object's GenerateMipmap flag is set and we've
22232914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul * changed the texture base level image, regenerate the rest of the
22242914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul * mipmap levels now.
22252914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul */
22269520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline void
2227f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcheck_gen_mipmap(struct gl_context *ctx, GLenum target,
22282914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul                 struct gl_texture_object *texObj, GLint level)
22292914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul{
22302914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul   ASSERT(target != GL_TEXTURE_CUBE_MAP);
2231ecb03d75a2961b28ab3d90fdd5df768608fc9447Brian Paul   if (texObj->GenerateMipmap &&
2232ecb03d75a2961b28ab3d90fdd5df768608fc9447Brian Paul       level == texObj->BaseLevel &&
2233ecb03d75a2961b28ab3d90fdd5df768608fc9447Brian Paul       level < texObj->MaxLevel) {
22342914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul      ASSERT(ctx->Driver.GenerateMipmap);
22352914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul      ctx->Driver.GenerateMipmap(ctx, target, texObj);
22362914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul   }
22372914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul}
22382914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
22392914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
22401826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul/** Debug helper: override the user-requested internal format */
22411826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paulstatic GLenum
22421826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Pauloverride_internal_format(GLenum internalFormat, GLint width, GLint height)
22431826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul{
22441826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul#if 0
22451826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   if (internalFormat == GL_RGBA16F_ARB ||
22461826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul       internalFormat == GL_RGBA32F_ARB) {
22471826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      printf("Convert rgba float tex to int %d x %d\n", width, height);
22481826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      return GL_RGBA;
22491826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   }
22501826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   else if (internalFormat == GL_RGB16F_ARB ||
22511826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul            internalFormat == GL_RGB32F_ARB) {
22521826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      printf("Convert rgb float tex to int %d x %d\n", width, height);
22531826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      return GL_RGB;
22541826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   }
22551826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   else if (internalFormat == GL_LUMINANCE_ALPHA16F_ARB ||
22561826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul            internalFormat == GL_LUMINANCE_ALPHA32F_ARB) {
22571826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      printf("Convert luminance float tex to int %d x %d\n", width, height);
22581826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      return GL_LUMINANCE_ALPHA;
22591826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   }
22601826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   else if (internalFormat == GL_LUMINANCE16F_ARB ||
22611826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul            internalFormat == GL_LUMINANCE32F_ARB) {
22621826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      printf("Convert luminance float tex to int %d x %d\n", width, height);
22631826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      return GL_LUMINANCE;
22641826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   }
22651826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   else if (internalFormat == GL_ALPHA16F_ARB ||
22661826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul            internalFormat == GL_ALPHA32F_ARB) {
22671826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      printf("Convert luminance float tex to int %d x %d\n", width, height);
22681826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      return GL_ALPHA;
22691826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   }
22701826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   /*
22711826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   else if (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) {
22721826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      internalFormat = GL_RGBA;
22731826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   }
22741826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   */
22751826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   else {
22761826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul      return internalFormat;
22771826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   }
22781826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul#else
22791826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul   return internalFormat;
22801826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul#endif
22811826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul}
22821826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul
2283519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul
2284bab484a59b21fff84579a492d079d46e27d486ddBrian Paul/**
2285bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * Choose the actual hardware format for a texture image.
2286bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * Try to use the same format as the previous image level when possible.
2287bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * Otherwise, ask the driver for the best format.
2288bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * It's important to try to choose a consistant format for all levels
2289bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * for efficient texture memory layout/allocation.  In particular, this
2290bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * comes up during automatic mipmap generation.
2291bab484a59b21fff84579a492d079d46e27d486ddBrian Paul */
229283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paulgl_format
2293f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_choose_texture_format(struct gl_context *ctx,
2294bab484a59b21fff84579a492d079d46e27d486ddBrian Paul                            struct gl_texture_object *texObj,
2295bab484a59b21fff84579a492d079d46e27d486ddBrian Paul                            GLenum target, GLint level,
2296bab484a59b21fff84579a492d079d46e27d486ddBrian Paul                            GLenum internalFormat, GLenum format, GLenum type)
2297bab484a59b21fff84579a492d079d46e27d486ddBrian Paul{
229883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   gl_format f;
229983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul
2300bab484a59b21fff84579a492d079d46e27d486ddBrian Paul   /* see if we've already chosen a format for the previous level */
2301bab484a59b21fff84579a492d079d46e27d486ddBrian Paul   if (level > 0) {
2302bab484a59b21fff84579a492d079d46e27d486ddBrian Paul      struct gl_texture_image *prevImage =
2303bab484a59b21fff84579a492d079d46e27d486ddBrian Paul	 _mesa_select_tex_image(ctx, texObj, target, level - 1);
2304bab484a59b21fff84579a492d079d46e27d486ddBrian Paul      /* See if the prev level is defined and has an internal format which
2305bab484a59b21fff84579a492d079d46e27d486ddBrian Paul       * matches the new internal format.
2306bab484a59b21fff84579a492d079d46e27d486ddBrian Paul       */
2307bab484a59b21fff84579a492d079d46e27d486ddBrian Paul      if (prevImage &&
2308bab484a59b21fff84579a492d079d46e27d486ddBrian Paul          prevImage->Width > 0 &&
2309bab484a59b21fff84579a492d079d46e27d486ddBrian Paul          prevImage->InternalFormat == internalFormat) {
2310bab484a59b21fff84579a492d079d46e27d486ddBrian Paul         /* use the same format */
231183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul         ASSERT(prevImage->TexFormat != MESA_FORMAT_NONE);
231283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul         return prevImage->TexFormat;
2313bab484a59b21fff84579a492d079d46e27d486ddBrian Paul      }
2314bab484a59b21fff84579a492d079d46e27d486ddBrian Paul   }
2315bab484a59b21fff84579a492d079d46e27d486ddBrian Paul
2316bab484a59b21fff84579a492d079d46e27d486ddBrian Paul   /* choose format from scratch */
231783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   f = ctx->Driver.ChooseTextureFormat(ctx, internalFormat, format, type);
231883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   ASSERT(f != MESA_FORMAT_NONE);
231983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   return f;
2320bab484a59b21fff84579a492d079d46e27d486ddBrian Paul}
2321bab484a59b21fff84579a492d079d46e27d486ddBrian Paul
23229c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt/**
23239c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * Adjust pixel unpack params and image dimensions to strip off the
23249c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * texture border.
23259c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt *
23269c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * Gallium and intel don't support texture borders.  They've seldem been used
23279c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * and seldom been implemented correctly anyway.
23289c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt *
23299c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * \param unpackNew returns the new pixel unpack parameters
23309c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt */
23319c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholtstatic void
23329c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholtstrip_texture_border(GLint *border,
23339c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt                     GLint *width, GLint *height, GLint *depth,
23349c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt                     const struct gl_pixelstore_attrib *unpack,
23359c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt                     struct gl_pixelstore_attrib *unpackNew)
23369c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt{
23379c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   assert(*border > 0);  /* sanity check */
23389c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt
23399c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   *unpackNew = *unpack;
23409c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt
23419c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   if (unpackNew->RowLength == 0)
23429c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt      unpackNew->RowLength = *width;
23439c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt
23449c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   if (depth && unpackNew->ImageHeight == 0)
23459c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt      unpackNew->ImageHeight = *height;
23469c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt
23479c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   unpackNew->SkipPixels += *border;
23489c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   if (height)
23499c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt      unpackNew->SkipRows += *border;
23509c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   if (depth)
23519c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt      unpackNew->SkipImages += *border;
23529c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt
23539c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   assert(*width >= 3);
23549c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   *width = *width - 2 * *border;
23559c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   if (height && *height >= 3)
23569c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt      *height = *height - 2 * *border;
23579c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   if (depth && *depth >= 3)
23589c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt      *depth = *depth - 2 * *border;
23599c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   *border = 0;
23609c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt}
2361bab484a59b21fff84579a492d079d46e27d486ddBrian Paul
2362d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul/**
2363d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul * Common code to implement all the glTexImage1D/2D/3D functions.
2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2365d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paulstatic void
2366d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paulteximage(struct gl_context *ctx, GLuint dims,
2367d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         GLenum target, GLint level, GLint internalFormat,
2368d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         GLsizei width, GLsizei height, GLsizei depth,
2369d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         GLint border, GLenum format, GLenum type,
2370d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         const GLvoid *pixels)
2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2372d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   GLboolean error;
23739c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   struct gl_pixelstore_attrib unpack_no_border;
23749c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   const struct gl_pixelstore_attrib *unpack = &ctx->Unpack;
2375d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul
2376cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2378d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
2379d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      _mesa_debug(ctx, "glTexImage%uD %s %d %s %d %d %d %d %s %s %p\n",
2380d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  dims,
2381d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora                  _mesa_lookup_enum_by_nr(target), level,
2382d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  _mesa_lookup_enum_by_nr(internalFormat),
2383d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  width, height, depth, border,
2384d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora                  _mesa_lookup_enum_by_nr(format),
2385d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora                  _mesa_lookup_enum_by_nr(type), pixels);
2386d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora
2387d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   internalFormat = override_internal_format(internalFormat, width, height);
238811caea687e3f10ae12d33e44edf84635f73047ddBrian Paul
2389d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   /* target error checking */
2390d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   if (!legal_teximage_target(ctx, dims, target)) {
2391d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glTexImage%uD(target=%s)",
2392d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  dims, _mesa_lookup_enum_by_nr(target));
2393d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      return;
2394d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   }
2395ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul
2396d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   /* general error checking */
2397d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   error = texture_error_check(ctx, dims, target, level, internalFormat,
2398d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                               format, type, width, height, depth, border);
23992914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
2400d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   if (_mesa_is_proxy_texture(target)) {
2401d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      /* Proxy texture: just clear or set state depending on error checking */
2402d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      struct gl_texture_image *texImage =
2403d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         _mesa_get_proxy_tex_image(ctx, target, level);
240462c734f49948df7aeef55ad23a6664cbf3e11533Brian Paul
2405d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      if (error) {
2406738318bb75dea8dac4465f53850987f6062a732dBrian Paul         /* when error, clear all proxy texture image parameters */
2407a3f137094cd965d27e1b088499dd609b81a91906Brian Paul         if (texImage)
2408a3f137094cd965d27e1b088499dd609b81a91906Brian Paul            clear_teximage_fields(texImage);
2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
241089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      else {
241189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         /* no error, set the tex image parameters */
2412bab484a59b21fff84579a492d079d46e27d486ddBrian Paul         struct gl_texture_object *texObj =
2413bab484a59b21fff84579a492d079d46e27d486ddBrian Paul            _mesa_get_current_tex_object(ctx, target);
2414d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         gl_format texFormat = _mesa_choose_texture_format(ctx, texObj,
2415d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                                                           target, level,
241683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul                                                           internalFormat,
241783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul                                                           format, type);
2418d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul
2419d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul         if (legal_texture_size(ctx, texFormat, width, height, depth)) {
2420d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul            _mesa_init_teximage_fields(ctx, target, texImage, width, height,
2421d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                                       depth, border, internalFormat,
2422d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                                       texFormat);
24234b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul         }
24244b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul         else if (texImage) {
24254b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            clear_teximage_fields(texImage);
24264b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul         }
242789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
24308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul      /* non-proxy target */
2431d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      const GLuint face = _mesa_tex_target_to_face(target);
24320293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul      struct gl_texture_object *texObj;
24330293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul      struct gl_texture_image *texImage;
2434f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul
2435d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul      if (error) {
24368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul         return;   /* error was recorded */
2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
24399c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt      /* Allow a hardware driver to just strip out the border, to provide
24409c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt       * reliable but slightly incorrect hardware rendering instead of
24419c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt       * rarely-tested software fallback rendering.
24429c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt       */
24439c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt      if (border && ctx->Const.StripTextureBorder) {
24449c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt	 strip_texture_border(&border, &width, &height, &depth, unpack,
24459c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt			      &unpack_no_border);
24469c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt	 unpack = &unpack_no_border;
24479c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt      }
24489c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt
24497ecb61c30c4984a8513b306b640f9d274d8ecf61Brian Paul      if (ctx->NewState & _NEW_PIXEL)
24505ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell	 _mesa_update_state(ctx);
2451fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul
2452b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul      texObj = _mesa_get_current_tex_object(ctx, target);
2453d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul
24545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      _mesa_lock_texture(ctx, texObj);
24555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      {
24565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell	 texImage = _mesa_get_tex_image(ctx, texObj, target, level);
2457d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul
24585ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell	 if (!texImage) {
2459d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul	    _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims);
24605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell	 }
2461ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul         else {
246283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul            gl_format texFormat;
246383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul
246468f8cf72638e974a5bf2ae3e88c2e3539d88e2b6Eric Anholt            ctx->Driver.FreeTextureImageBuffer(ctx, texImage);
2465ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul
246683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul            texFormat = _mesa_choose_texture_format(ctx, texObj, target, level,
246783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul                                                    internalFormat, format,
246883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul                                                    type);
246983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul
2470d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul            if (legal_texture_size(ctx, texFormat, width, height, depth)) {
2471d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul               _mesa_init_teximage_fields(ctx, target, texImage,
2472d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                                          width, height, depth,
2473d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                                          border, internalFormat, texFormat);
247411caea687e3f10ae12d33e44edf84635f73047ddBrian Paul
24754b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul               /* Give the texture to the driver.  <pixels> may be null. */
2476d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul               ASSERT(ctx->Driver.TexImage3D);
2477d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul               switch (dims) {
2478d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul               case 1:
2479d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  ctx->Driver.TexImage1D(ctx, target, level, internalFormat,
2480d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                                         width, border, format,
24819c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt                                         type, pixels, unpack, texObj,
2482d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                                         texImage);
2483d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  break;
2484d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul               case 2:
2485d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  ctx->Driver.TexImage2D(ctx, target, level, internalFormat,
2486d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                                         width, height, border, format,
24879c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt                                         type, pixels, unpack, texObj,
2488d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                                         texImage);
2489d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  break;
2490d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul               case 3:
2491d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  ctx->Driver.TexImage3D(ctx, target, level, internalFormat,
2492d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                                         width, height, depth, border, format,
24939c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt                                         type, pixels, unpack, texObj,
2494d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                                         texImage);
2495d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  break;
2496d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul               default:
2497d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  _mesa_problem(ctx, "invalid dims=%u in teximage()", dims);
2498d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul               }
2499ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul
25004b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul               check_gen_mipmap(ctx, target, texObj, level);
25012914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
25024b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul               update_fbo_texture(ctx, texObj, face, level);
2503ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul
25044b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul               /* state update */
25054b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul               texObj->_Complete = GL_FALSE;
25064b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul               ctx->NewState |= _NEW_TEXTURE;
25074b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            }
25084b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            else {
2509d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul               _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims);
25104b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            }
2511ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul         }
2512ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul      }
25135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      _mesa_unlock_texture(ctx, texObj);
2514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
2515d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul}
2516d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul
2517d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul
2518d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul/*
2519d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul * Called from the API.  Note that width includes the border.
2520d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul */
2521d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paulvoid GLAPIENTRY
2522d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul_mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
2523d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  GLsizei width, GLint border, GLenum format,
2524d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  GLenum type, const GLvoid *pixels )
2525d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul{
2526d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   GET_CURRENT_CONTEXT(ctx);
2527d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   teximage(ctx, 1, target, level, internalFormat, width, 1, 1,
2528d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul            border, format, type, pixels);
2529d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul}
2530d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul
2531d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul
2532d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paulvoid GLAPIENTRY
2533d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul_mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
2534d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  GLsizei width, GLsizei height, GLint border,
2535d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  GLenum format, GLenum type,
2536d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul                  const GLvoid *pixels )
2537d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul{
2538d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   GET_CURRENT_CONTEXT(ctx);
2539d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   teximage(ctx, 2, target, level, internalFormat, width, height, 1,
2540d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul            border, format, type, pixels);
2541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Called by the API or display list executor.
2546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Note that width and height include the border.
2547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
2548c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
2549b5fd886ee12ef52126969f712dee0bd4b2eea706Brian Paul_mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
2550fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  GLsizei width, GLsizei height, GLsizei depth,
2551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  GLint border, GLenum format, GLenum type,
2552fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  const GLvoid *pixels )
2553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
2554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
2555d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul   teximage(ctx, 3, target, level, internalFormat, width, height, depth,
2556d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul            border, format, type, pixels);
2557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2560c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
256143911c8ef06c44d486a17cf9a8fa8ea263b08adeBrian Paul_mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalFormat,
2562663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul                     GLsizei width, GLsizei height, GLsizei depth,
2563663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul                     GLint border, GLenum format, GLenum type,
2564663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul                     const GLvoid *pixels )
2565663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul{
256689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   _mesa_TexImage3D(target, level, (GLint) internalFormat, width, height,
2567663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul                    depth, border, format, type, pixels);
2568663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul}
2569663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul
2570663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul
2571d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg#if FEATURE_OES_EGL_image
2572d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsbergvoid GLAPIENTRY
2573d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg_mesa_EGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image)
2574d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg{
2575d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg   struct gl_texture_object *texObj;
2576d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg   struct gl_texture_image *texImage;
257717efc8c05c6931a4638ee9f6138794f2b2b29540Vinson Lee   GET_CURRENT_CONTEXT(ctx);
257817efc8c05c6931a4638ee9f6138794f2b2b29540Vinson Lee   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2579d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg
25800c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu   if ((target == GL_TEXTURE_2D &&
25810c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu        !ctx->Extensions.OES_EGL_image) ||
25820c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu       (target == GL_TEXTURE_EXTERNAL_OES &&
25830c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu        !ctx->Extensions.OES_EGL_image_external)) {
2584d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg      _mesa_error(ctx, GL_INVALID_ENUM,
2585d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg		  "glEGLImageTargetTexture2D(target=%d)", target);
2586d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg      return;
2587d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg   }
2588d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg
25897ecb61c30c4984a8513b306b640f9d274d8ecf61Brian Paul   if (ctx->NewState & _NEW_PIXEL)
2590d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg      _mesa_update_state(ctx);
2591d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg
2592d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg   texObj = _mesa_get_current_tex_object(ctx, target);
2593d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg   _mesa_lock_texture(ctx, texObj);
2594d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg
2595d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg   texImage = _mesa_get_tex_image(ctx, texObj, target, 0);
2596d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg   if (!texImage) {
2597d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glEGLImageTargetTexture2D");
2598d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg   } else {
259968f8cf72638e974a5bf2ae3e88c2e3539d88e2b6Eric Anholt      ctx->Driver.FreeTextureImageBuffer(ctx, texImage);
2600d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg
2601d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg      ctx->Driver.EGLImageTargetTexture2D(ctx, target,
2602d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg					  texObj, texImage, image);
2603d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg
2604d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg      /* state update */
2605d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg      texObj->_Complete = GL_FALSE;
2606d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg      ctx->NewState |= _NEW_TEXTURE;
2607d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg   }
2608d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg   _mesa_unlock_texture(ctx, texObj);
2609d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg
2610d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg}
2611d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg#endif
2612d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg
2613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
261445124e043da5a67e1081526d61b99422f4ccde19Brian Paul
261545124e043da5a67e1081526d61b99422f4ccde19Brian Paul/**
261645124e043da5a67e1081526d61b99422f4ccde19Brian Paul * Implement all the glTexSubImage1/2/3D() functions.
261745124e043da5a67e1081526d61b99422f4ccde19Brian Paul */
261845124e043da5a67e1081526d61b99422f4ccde19Brian Paulstatic void
261945124e043da5a67e1081526d61b99422f4ccde19Brian Paultexsubimage(struct gl_context *ctx, GLuint dims, GLenum target, GLint level,
262045124e043da5a67e1081526d61b99422f4ccde19Brian Paul            GLint xoffset, GLint yoffset, GLint zoffset,
262145124e043da5a67e1081526d61b99422f4ccde19Brian Paul            GLsizei width, GLsizei height, GLsizei depth,
262245124e043da5a67e1081526d61b99422f4ccde19Brian Paul            GLenum format, GLenum type, const GLvoid *pixels )
2623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
26240293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul   struct gl_texture_object *texObj;
2625b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul   struct gl_texture_image *texImage;
262645124e043da5a67e1081526d61b99422f4ccde19Brian Paul
262775280a2c742ee241d392618a3b29548fce1520a9Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
262875280a2c742ee241d392618a3b29548fce1520a9Brian Paul
2629d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
263045124e043da5a67e1081526d61b99422f4ccde19Brian Paul      _mesa_debug(ctx, "glTexSubImage%uD %s %d %d %d %d %d %d %d %s %s %p\n",
263145124e043da5a67e1081526d61b99422f4ccde19Brian Paul                  dims,
2632d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora                  _mesa_lookup_enum_by_nr(target), level,
263345124e043da5a67e1081526d61b99422f4ccde19Brian Paul                  xoffset, yoffset, zoffset, width, height, depth,
263445124e043da5a67e1081526d61b99422f4ccde19Brian Paul                  _mesa_lookup_enum_by_nr(format),
2635d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora                  _mesa_lookup_enum_by_nr(type), pixels);
2636d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora
263745124e043da5a67e1081526d61b99422f4ccde19Brian Paul   /* check target (proxies not allowed) */
263809a5e028a6d254f619132e302a96c8535018603dBrian Paul   if (!legal_texsubimage_target(ctx, dims, target)) {
263945124e043da5a67e1081526d61b99422f4ccde19Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glTexSubImage%uD(target=%s)",
264045124e043da5a67e1081526d61b99422f4ccde19Brian Paul                  dims, _mesa_lookup_enum_by_nr(target));
264145124e043da5a67e1081526d61b99422f4ccde19Brian Paul      return;
264245124e043da5a67e1081526d61b99422f4ccde19Brian Paul   }
264345124e043da5a67e1081526d61b99422f4ccde19Brian Paul
26447ecb61c30c4984a8513b306b640f9d274d8ecf61Brian Paul   if (ctx->NewState & _NEW_PIXEL)
264508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_update_state(ctx);
26462aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul
264745124e043da5a67e1081526d61b99422f4ccde19Brian Paul   if (subtexture_error_check(ctx, dims, target, level, xoffset, yoffset, zoffset,
264845124e043da5a67e1081526d61b99422f4ccde19Brian Paul                              width, height, depth, format, type)) {
2649f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul      return;   /* error was detected */
2650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
2651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2652b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul   texObj = _mesa_get_current_tex_object(ctx, target);
2653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
26545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   _mesa_lock_texture(ctx, texObj);
26555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   {
26565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      texImage = _mesa_select_tex_image(ctx, texObj, target, level);
2657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
265845124e043da5a67e1081526d61b99422f4ccde19Brian Paul      if (subtexture_error_check2(ctx, dims, target, level,
265945124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                  xoffset, yoffset, zoffset,
266045124e043da5a67e1081526d61b99422f4ccde19Brian Paul				  width, height, depth,
266145124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                  format, type, texImage)) {
2662a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul         /* error was recorded */
26635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      }
26644609e80288bacf19af99b0ed7656eef9bb280912Brian Paul      else if (width > 0 && height > 0 && depth > 0) {
266545124e043da5a67e1081526d61b99422f4ccde19Brian Paul         /* If we have a border, offset=-1 is legal.  Bias by border width. */
266645124e043da5a67e1081526d61b99422f4ccde19Brian Paul         switch (dims) {
266745124e043da5a67e1081526d61b99422f4ccde19Brian Paul         case 3:
266845124e043da5a67e1081526d61b99422f4ccde19Brian Paul            zoffset += texImage->Border;
266945124e043da5a67e1081526d61b99422f4ccde19Brian Paul            /* fall-through */
267045124e043da5a67e1081526d61b99422f4ccde19Brian Paul         case 2:
267145124e043da5a67e1081526d61b99422f4ccde19Brian Paul            yoffset += texImage->Border;
267245124e043da5a67e1081526d61b99422f4ccde19Brian Paul            /* fall-through */
267345124e043da5a67e1081526d61b99422f4ccde19Brian Paul         case 1:
267445124e043da5a67e1081526d61b99422f4ccde19Brian Paul            xoffset += texImage->Border;
267545124e043da5a67e1081526d61b99422f4ccde19Brian Paul         }
2676347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul
267745124e043da5a67e1081526d61b99422f4ccde19Brian Paul         switch (dims) {
267845124e043da5a67e1081526d61b99422f4ccde19Brian Paul         case 1:
267945124e043da5a67e1081526d61b99422f4ccde19Brian Paul            ctx->Driver.TexSubImage1D(ctx, target, level,
268045124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                      xoffset, width,
268145124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                      format, type, pixels,
268245124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                      &ctx->Unpack, texObj, texImage );
268345124e043da5a67e1081526d61b99422f4ccde19Brian Paul            break;
268445124e043da5a67e1081526d61b99422f4ccde19Brian Paul         case 2:
268545124e043da5a67e1081526d61b99422f4ccde19Brian Paul            ctx->Driver.TexSubImage2D(ctx, target, level,
268645124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                      xoffset, yoffset, width, height,
268745124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                      format, type, pixels,
268845124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                      &ctx->Unpack, texObj, texImage );
268945124e043da5a67e1081526d61b99422f4ccde19Brian Paul            break;
269045124e043da5a67e1081526d61b99422f4ccde19Brian Paul         case 3:
269145124e043da5a67e1081526d61b99422f4ccde19Brian Paul            ctx->Driver.TexSubImage3D(ctx, target, level,
269245124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                      xoffset, yoffset, zoffset,
269345124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                      width, height, depth,
269445124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                      format, type, pixels,
269545124e043da5a67e1081526d61b99422f4ccde19Brian Paul                                      &ctx->Unpack, texObj, texImage );
269645124e043da5a67e1081526d61b99422f4ccde19Brian Paul            break;
269745124e043da5a67e1081526d61b99422f4ccde19Brian Paul         default:
269845124e043da5a67e1081526d61b99422f4ccde19Brian Paul            _mesa_problem(ctx, "unexpected dims in subteximage()");
269945124e043da5a67e1081526d61b99422f4ccde19Brian Paul         }
27002914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
27012914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul         check_gen_mipmap(ctx, target, texObj, level);
27022914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
2703ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul         ctx->NewState |= _NEW_TEXTURE;
2704ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul      }
27055ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   }
27065ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   _mesa_unlock_texture(ctx, texObj);
2707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2710c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
271145124e043da5a67e1081526d61b99422f4ccde19Brian Paul_mesa_TexSubImage1D( GLenum target, GLint level,
271245124e043da5a67e1081526d61b99422f4ccde19Brian Paul                     GLint xoffset, GLsizei width,
271345124e043da5a67e1081526d61b99422f4ccde19Brian Paul                     GLenum format, GLenum type,
271445124e043da5a67e1081526d61b99422f4ccde19Brian Paul                     const GLvoid *pixels )
271545124e043da5a67e1081526d61b99422f4ccde19Brian Paul{
271645124e043da5a67e1081526d61b99422f4ccde19Brian Paul   GET_CURRENT_CONTEXT(ctx);
271745124e043da5a67e1081526d61b99422f4ccde19Brian Paul   texsubimage(ctx, 1, target, level,
271845124e043da5a67e1081526d61b99422f4ccde19Brian Paul               xoffset, 0, 0,
271945124e043da5a67e1081526d61b99422f4ccde19Brian Paul               width, 1, 1,
272045124e043da5a67e1081526d61b99422f4ccde19Brian Paul               format, type, pixels);
272145124e043da5a67e1081526d61b99422f4ccde19Brian Paul}
272245124e043da5a67e1081526d61b99422f4ccde19Brian Paul
272345124e043da5a67e1081526d61b99422f4ccde19Brian Paul
272445124e043da5a67e1081526d61b99422f4ccde19Brian Paulvoid GLAPIENTRY
2725fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexSubImage2D( GLenum target, GLint level,
2726fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                     GLint xoffset, GLint yoffset,
2727fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                     GLsizei width, GLsizei height,
2728fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                     GLenum format, GLenum type,
2729fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                     const GLvoid *pixels )
2730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
27312c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes   GET_CURRENT_CONTEXT(ctx);
273245124e043da5a67e1081526d61b99422f4ccde19Brian Paul   texsubimage(ctx, 2, target, level,
273345124e043da5a67e1081526d61b99422f4ccde19Brian Paul               xoffset, yoffset, 0,
273445124e043da5a67e1081526d61b99422f4ccde19Brian Paul               width, height, 1,
273545124e043da5a67e1081526d61b99422f4ccde19Brian Paul               format, type, pixels);
2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2740c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
2741fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexSubImage3D( GLenum target, GLint level,
2742fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                     GLint xoffset, GLint yoffset, GLint zoffset,
2743fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                     GLsizei width, GLsizei height, GLsizei depth,
2744fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                     GLenum format, GLenum type,
2745fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                     const GLvoid *pixels )
2746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
27472c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes   GET_CURRENT_CONTEXT(ctx);
274845124e043da5a67e1081526d61b99422f4ccde19Brian Paul   texsubimage(ctx, 3, target, level,
274945124e043da5a67e1081526d61b99422f4ccde19Brian Paul               xoffset, yoffset, zoffset,
275045124e043da5a67e1081526d61b99422f4ccde19Brian Paul               width, height, depth,
275145124e043da5a67e1081526d61b99422f4ccde19Brian Paul               format, type, pixels);
2752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
275611f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul/**
275711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul * Implement the glCopyTexImage1/2D() functions.
275811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul */
275911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paulstatic void
276011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paulcopyteximage(struct gl_context *ctx, GLuint dims,
276111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul             GLenum target, GLint level, GLenum internalFormat,
276211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul             GLint x, GLint y, GLsizei width, GLsizei height, GLint border )
2763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
27642aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul   struct gl_texture_object *texObj;
27652aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul   struct gl_texture_image *texImage;
2766e93243f8b7d43695654a36334c8cc5cea140d23cBrian   const GLuint face = _mesa_tex_target_to_face(target);
276711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul
2768cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2770d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
277111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul      _mesa_debug(ctx, "glCopyTexImage%uD %s %d %s %d %d %d %d %d\n",
277211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                  dims,
2773d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora                  _mesa_lookup_enum_by_nr(target), level,
2774d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora                  _mesa_lookup_enum_by_nr(internalFormat),
277511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                  x, y, width, height, border);
2776d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora
277763f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul   if (ctx->NewState & NEW_COPY_TEX_STATE)
277808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_update_state(ctx);
2779fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul
278011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   if (copytexture_error_check(ctx, dims, target, level, internalFormat,
278111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                               width, height, border))
2782ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul      return;
2783ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul
2784b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul   texObj = _mesa_get_current_tex_object(ctx, target);
2785a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul
2786638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt   if (border && ctx->Const.StripTextureBorder) {
2787638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt      x += border;
2788638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt      width -= border * 2;
2789638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt      if (dims == 2) {
2790638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt	 y += border;
2791638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt	 height -= border * 2;
2792638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt      }
2793638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt      border = 0;
2794638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt   }
2795638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt
27965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   _mesa_lock_texture(ctx, texObj);
27975ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   {
27985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      texImage = _mesa_get_tex_image(ctx, texObj, target, level);
279911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul
28005ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      if (!texImage) {
280111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul	 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD", dims);
28025ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      }
2803c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul      else {
28045874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul         /* choose actual hw format */
28055874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul         gl_format texFormat = _mesa_choose_texture_format(ctx, texObj,
28065874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                                                           target, level,
28075874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                                                           internalFormat,
28085874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                                                           GL_NONE, GL_NONE);
28097dac13272a959654f1010b80c1f1ec6dcae5a4faBrian Paul
28105874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul         if (legal_texture_size(ctx, texFormat, width, height, 1)) {
28115874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul            GLint srcX = x, srcY = y, dstX = 0, dstY = 0;
28127dac13272a959654f1010b80c1f1ec6dcae5a4faBrian Paul
28135874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul            /* Free old texture image */
28140bb29949ba8a9e5a15dc0640dbb0a4e7990a1d57Eric Anholt            ctx->Driver.FreeTextureImageBuffer(ctx, texImage);
28152aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul
281611f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul            _mesa_init_teximage_fields(ctx, target, texImage, width, height, 1,
28174b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul                                       border, internalFormat, texFormat);
281811caea687e3f10ae12d33e44edf84635f73047ddBrian Paul
28195874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul            /* Allocate texture memory (no pixel data yet) */
28205874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul            if (dims == 1) {
28215874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul               ctx->Driver.TexImage1D(ctx, target, level, internalFormat,
28225874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                                      width, border, GL_NONE, GL_NONE, NULL,
28235874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                                      &ctx->Unpack, texObj, texImage);
28245874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul            }
28255874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul            else {
28265874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul               ctx->Driver.TexImage2D(ctx, target, level, internalFormat,
28275874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                                      width, height, border, GL_NONE, GL_NONE,
28285874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                                      NULL, &ctx->Unpack, texObj, texImage);
28295874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul            }
28305874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul
28315874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul            if (_mesa_clip_copytexsubimage(ctx, &dstX, &dstY, &srcX, &srcY,
28325874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                                           &width, &height)) {
28335874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul               if (dims == 1)
28345874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                  ctx->Driver.CopyTexSubImage1D(ctx, target, level, dstX,
28355874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                                                srcX, srcY, width);
28365874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul
28375874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul               else
28385874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                  ctx->Driver.CopyTexSubImage2D(ctx, target, level, dstX, dstY,
28395874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul                                                srcX, srcY, width, height);
28405874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul            }
28412aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul
28424b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            check_gen_mipmap(ctx, target, texObj, level);
28432914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
28444b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            update_fbo_texture(ctx, texObj, face, level);
2845519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul
28464b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            /* state update */
28474b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            texObj->_Complete = GL_FALSE;
28484b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            ctx->NewState |= _NEW_TEXTURE;
28494b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul         }
28504b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul         else {
28515874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul            /* probably too large of image */
285211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD", dims);
28534b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul         }
2854c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul      }
28555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   }
28565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   _mesa_unlock_texture(ctx, texObj);
2857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2861c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
286211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul_mesa_CopyTexImage1D( GLenum target, GLint level,
286311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                      GLenum internalFormat,
286411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                      GLint x, GLint y,
286511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                      GLsizei width, GLint border )
2866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
2867fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
286811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   copyteximage(ctx, 1, target, level, internalFormat, x, y, width, 1, border);
286911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul}
2870c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul
28712914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
2872c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul
287311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paulvoid GLAPIENTRY
287411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul_mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat,
287511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                      GLint x, GLint y, GLsizei width, GLsizei height,
287611f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                      GLint border )
287711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul{
287811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   GET_CURRENT_CONTEXT(ctx);
287911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul   copyteximage(ctx, 2, target, level, internalFormat,
288011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul                x, y, width, height, border);
2881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
28841c23b860cea93534f726d2a18658444f37f43538Brian Paul
28851c23b860cea93534f726d2a18658444f37f43538Brian Paul/**
28861c23b860cea93534f726d2a18658444f37f43538Brian Paul * Implementation for glCopyTexSubImage1/2/3D() functions.
28871c23b860cea93534f726d2a18658444f37f43538Brian Paul */
28881c23b860cea93534f726d2a18658444f37f43538Brian Paulstatic void
28891c23b860cea93534f726d2a18658444f37f43538Brian Paulcopytexsubimage(struct gl_context *ctx, GLuint dims, GLenum target, GLint level,
28901c23b860cea93534f726d2a18658444f37f43538Brian Paul                GLint xoffset, GLint yoffset, GLint zoffset,
28911c23b860cea93534f726d2a18658444f37f43538Brian Paul                GLint x, GLint y, GLsizei width, GLsizei height)
2892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
28935ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   struct gl_texture_object *texObj;
2894347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul   struct gl_texture_image *texImage;
289503bafd1f9fa000abdb794b2ae344a68840c83201Brian
2896cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2898d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
28991c23b860cea93534f726d2a18658444f37f43538Brian Paul      _mesa_debug(ctx, "glCopyTexSubImage%uD %s %d %d %d %d %d %d %d %d\n",
29001c23b860cea93534f726d2a18658444f37f43538Brian Paul                  dims,
2901d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora                  _mesa_lookup_enum_by_nr(target),
29021c23b860cea93534f726d2a18658444f37f43538Brian Paul                  level, xoffset, yoffset, zoffset, x, y, width, height);
2903d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora
290463f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul   if (ctx->NewState & NEW_COPY_TEX_STATE)
290508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_update_state(ctx);
2906fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul
29071c23b860cea93534f726d2a18658444f37f43538Brian Paul   if (copytexsubimage_error_check1(ctx, dims, target, level))
2908ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul      return;
2909ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul
2910b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul   texObj = _mesa_get_current_tex_object(ctx, target);
29115ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
29125ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   _mesa_lock_texture(ctx, texObj);
29135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   {
29145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      texImage = _mesa_select_tex_image(ctx, texObj, target, level);
29155ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
29161c23b860cea93534f726d2a18658444f37f43538Brian Paul      if (copytexsubimage_error_check2(ctx, dims, target, level, xoffset, yoffset,
29171c23b860cea93534f726d2a18658444f37f43538Brian Paul				       zoffset, width, height, texImage)) {
29181c23b860cea93534f726d2a18658444f37f43538Brian Paul         /* error was recored */
291903bafd1f9fa000abdb794b2ae344a68840c83201Brian      }
2920a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul      else {
29211c23b860cea93534f726d2a18658444f37f43538Brian Paul         /* If we have a border, offset=-1 is legal.  Bias by border width. */
29221c23b860cea93534f726d2a18658444f37f43538Brian Paul         switch (dims) {
29231c23b860cea93534f726d2a18658444f37f43538Brian Paul         case 3:
29241c23b860cea93534f726d2a18658444f37f43538Brian Paul            zoffset += texImage->Border;
29251c23b860cea93534f726d2a18658444f37f43538Brian Paul            /* fall-through */
29261c23b860cea93534f726d2a18658444f37f43538Brian Paul         case 2:
29271c23b860cea93534f726d2a18658444f37f43538Brian Paul            yoffset += texImage->Border;
29281c23b860cea93534f726d2a18658444f37f43538Brian Paul            /* fall-through */
29291c23b860cea93534f726d2a18658444f37f43538Brian Paul         case 1:
29301c23b860cea93534f726d2a18658444f37f43538Brian Paul            xoffset += texImage->Border;
29311c23b860cea93534f726d2a18658444f37f43538Brian Paul         }
293203bafd1f9fa000abdb794b2ae344a68840c83201Brian
2933a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul         if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y,
2934a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul                                        &width, &height)) {
29351c23b860cea93534f726d2a18658444f37f43538Brian Paul            switch (dims) {
29361c23b860cea93534f726d2a18658444f37f43538Brian Paul            case 1:
29371c23b860cea93534f726d2a18658444f37f43538Brian Paul               ctx->Driver.CopyTexSubImage1D(ctx, target, level,
29381c23b860cea93534f726d2a18658444f37f43538Brian Paul                                             xoffset, x, y, width);
29391c23b860cea93534f726d2a18658444f37f43538Brian Paul               break;
29401c23b860cea93534f726d2a18658444f37f43538Brian Paul            case 2:
29411c23b860cea93534f726d2a18658444f37f43538Brian Paul               ctx->Driver.CopyTexSubImage2D(ctx, target, level,
29421c23b860cea93534f726d2a18658444f37f43538Brian Paul                                             xoffset, yoffset,
29431c23b860cea93534f726d2a18658444f37f43538Brian Paul                                             x, y, width, height);
29441c23b860cea93534f726d2a18658444f37f43538Brian Paul               break;
29451c23b860cea93534f726d2a18658444f37f43538Brian Paul            case 3:
29461c23b860cea93534f726d2a18658444f37f43538Brian Paul               ctx->Driver.CopyTexSubImage3D(ctx, target, level,
29471c23b860cea93534f726d2a18658444f37f43538Brian Paul                                             xoffset, yoffset, zoffset,
29481c23b860cea93534f726d2a18658444f37f43538Brian Paul                                             x, y, width, height);
29491c23b860cea93534f726d2a18658444f37f43538Brian Paul               break;
29501c23b860cea93534f726d2a18658444f37f43538Brian Paul            default:
29511c23b860cea93534f726d2a18658444f37f43538Brian Paul               _mesa_problem(ctx, "bad dims in copytexsubimage()");
29521c23b860cea93534f726d2a18658444f37f43538Brian Paul            }
29532914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
29542914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul            check_gen_mipmap(ctx, target, texObj, level);
29552914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
2956a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul            ctx->NewState |= _NEW_TEXTURE;
2957a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul         }
2958a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul      }
29595ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   }
29605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   _mesa_unlock_texture(ctx, texObj);
2961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
29641c23b860cea93534f726d2a18658444f37f43538Brian Paulvoid GLAPIENTRY
29651c23b860cea93534f726d2a18658444f37f43538Brian Paul_mesa_CopyTexSubImage1D( GLenum target, GLint level,
29661c23b860cea93534f726d2a18658444f37f43538Brian Paul                         GLint xoffset, GLint x, GLint y, GLsizei width )
29671c23b860cea93534f726d2a18658444f37f43538Brian Paul{
29681c23b860cea93534f726d2a18658444f37f43538Brian Paul   GET_CURRENT_CONTEXT(ctx);
29691c23b860cea93534f726d2a18658444f37f43538Brian Paul   copytexsubimage(ctx, 1, target, level, xoffset, 0, 0, x, y, width, 1);
29701c23b860cea93534f726d2a18658444f37f43538Brian Paul}
29711c23b860cea93534f726d2a18658444f37f43538Brian Paul
29721c23b860cea93534f726d2a18658444f37f43538Brian Paul
2973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2974c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
2975fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexSubImage2D( GLenum target, GLint level,
2976fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLint xoffset, GLint yoffset,
2977fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLint x, GLint y, GLsizei width, GLsizei height )
2978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
2979fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
29801c23b860cea93534f726d2a18658444f37f43538Brian Paul   copytexsubimage(ctx, 2, target, level, xoffset, yoffset, 0, x, y,
29811c23b860cea93534f726d2a18658444f37f43538Brian Paul                   width, height);
2982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2986c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
2987fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexSubImage3D( GLenum target, GLint level,
2988fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLint xoffset, GLint yoffset, GLint zoffset,
2989fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLint x, GLint y, GLsizei width, GLsizei height )
2990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
2991fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
29921c23b860cea93534f726d2a18658444f37f43538Brian Paul   copytexsubimage(ctx, 3, target, level, xoffset, yoffset, zoffset,
29931c23b860cea93534f726d2a18658444f37f43538Brian Paul                   x, y, width, height);
2994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
29951207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul
29961207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul
29971207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul
299889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
299989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**********************************************************************/
300089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/******                   Compressed Textures                    ******/
300189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**********************************************************************/
300289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
300389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
300489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
300554bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul * Return expected size of a compressed texture.
300654bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul */
300754bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paulstatic GLuint
300854bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paulcompressed_tex_size(GLsizei width, GLsizei height, GLsizei depth,
300954bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul                    GLenum glformat)
301054bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul{
301154bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul   gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat);
301254bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul   return _mesa_format_image_size(mesaFormat, width, height, depth);
301354bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul}
301454bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul
301554bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul
301607ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul/*
301707ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul * Return compressed texture block size, in pixels.
301807ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul */
301907ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paulstatic void
302007ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paulget_compressed_block_size(GLenum glformat, GLuint *bw, GLuint *bh)
302107ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul{
302207ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul   gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat);
302307ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul   _mesa_get_format_block_size(mesaFormat, bw, bh);
302407ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul}
302554bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul
302654bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul
302754bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul/**
302889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Error checking for glCompressedTexImage[123]D().
3029d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch * \param reason  returns reason for error, if any
303089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * \return error code or GL_NO_ERROR.
303189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
303289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulstatic GLenum
3033f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompressed_texture_error_check(struct gl_context *ctx, GLint dimensions,
303489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                               GLenum target, GLint level,
303589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                               GLenum internalFormat, GLsizei width,
303689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                               GLsizei height, GLsizei depth, GLint border,
3037d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch                               GLsizei imageSize, char **reason)
303889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
30394ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   const GLenum proxyTarget = get_proxy_target(target);
30404ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   const GLint maxLevels = _mesa_max_texture_levels(ctx, target);
30414ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   GLint expectedSize;
30423ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   GLenum choose_format;
30433ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   GLenum choose_type;
30443ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   GLenum proxy_format;
304589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3046d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch   *reason = ""; /* no error */
3047d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch
30487404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul   if (!target_can_be_compressed(ctx, target, internalFormat)) {
3049d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch      *reason = "target";
30507404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      return GL_INVALID_ENUM;
30517404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul   }
30527404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul
3053c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul   /* This will detect any invalid internalFormat value */
3054d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch   if (!_mesa_is_compressed_format(ctx, internalFormat)) {
3055d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch      *reason = "internalFormat";
305689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_ENUM;
3057d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch   }
305889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
30593ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   switch (internalFormat) {
30603ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick#if FEATURE_ES
30613ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   case GL_PALETTE4_RGB8_OES:
30623ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   case GL_PALETTE4_RGBA8_OES:
30633ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   case GL_PALETTE4_R5_G6_B5_OES:
30643ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   case GL_PALETTE4_RGBA4_OES:
30653ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   case GL_PALETTE4_RGB5_A1_OES:
30663ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   case GL_PALETTE8_RGB8_OES:
30673ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   case GL_PALETTE8_RGBA8_OES:
30683ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   case GL_PALETTE8_R5_G6_B5_OES:
30693ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   case GL_PALETTE8_RGBA4_OES:
30703ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   case GL_PALETTE8_RGB5_A1_OES:
30713ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      _mesa_cpal_compressed_format_type(internalFormat, &choose_format,
30723ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick					&choose_type);
30733ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      proxy_format = choose_format;
30743ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick
30753ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      /* check level */
30763ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      if (level > 0 || level < -maxLevels) {
30773ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick	 *reason = "level";
30783ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick	 return GL_INVALID_VALUE;
30793ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      }
30803ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick
30813ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      if (dimensions != 2) {
30823ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick	 *reason = "compressed paletted textures must be 2D";
30833ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick	 return GL_INVALID_OPERATION;
30843ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      }
30853ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick
30863ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      /* Figure out the expected texture size (in bytes).  This will be
30873ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick       * checked against the actual size later.
30883ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick       */
30893ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      expectedSize = _mesa_cpal_compressed_size(level, internalFormat,
30903ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick						width, height);
30913ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick
30923ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      /* This is for the benefit of the TestProxyTexImage below.  It expects
30933ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick       * level to be non-negative.  OES_compressed_paletted_texture uses a
30943ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick       * weird mechanism where the level specified to glCompressedTexImage2D
30953ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick       * is -(n-1) number of levels in the texture, and the data specifies the
30963ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick       * complete mipmap stack.  This is done to ensure the palette is the
30973ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick       * same for all levels.
30983ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick       */
30993ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      level = -level;
31003ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      break;
31013ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick#endif
31023ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick
31033ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   default:
31043ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      choose_format = GL_NONE;
31053ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      choose_type = GL_NONE;
31063ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      proxy_format = internalFormat;
31073ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick
31083ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      /* check level */
31093ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      if (level < 0 || level >= maxLevels) {
31103ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick	 *reason = "level";
31113ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick	 return GL_INVALID_VALUE;
31123ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      }
31133ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick
31143ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      /* Figure out the expected texture size (in bytes).  This will be
31153ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick       * checked against the actual size later.
31163ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick       */
31173ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      expectedSize = compressed_tex_size(width, height, depth, internalFormat);
31183ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick      break;
31193ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick   }
31203ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick
3121c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul   /* This should really never fail */
3122d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch   if (_mesa_base_tex_format(ctx, internalFormat) < 0) {
3123d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch      *reason = "internalFormat";
3124a2dc424acfe83f3c66d3509f5a1efc24ce884367Ian Romanick      return GL_INVALID_ENUM;
3125d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch   }
3126a2dc424acfe83f3c66d3509f5a1efc24ce884367Ian Romanick
31274ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   /* No compressed formats support borders at this time */
3128d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch   if (border != 0) {
3129d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch      *reason = "border != 0";
313089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_VALUE;
3131d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch   }
313289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
313389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* For cube map, width must equal height */
31342efa3d4f9fd1e1683c5366d402d8740ecfb688e5Brian Paul   if (_mesa_is_cube_face(target) && width != height) {
3135d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch      *reason = "width != height";
313689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_VALUE;
3137d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch   }
313889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
31397404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul   /* check image size against compression block size */
31407404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul   {
31417404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      gl_format texFormat =
31423ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick         ctx->Driver.ChooseTextureFormat(ctx, proxy_format,
31433ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick					 choose_format, choose_type);
31447404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      GLuint bw, bh;
31457404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul
31467404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      _mesa_get_format_block_size(texFormat, &bw, &bh);
31477404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      if ((width > bw && width % bw > 0) ||
31487404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul          (height > bh && height % bh > 0)) {
31497404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul         /*
31507404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul          * Per GL_ARB_texture_compression:  GL_INVALID_OPERATION is
31517404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul          * generated [...] if any parameter combinations are not
31527404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul          * supported by the specific compressed internal format.
31537404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul          */
3154d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch         *reason = "invalid width or height for compression format";
31557404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul         return GL_INVALID_OPERATION;
31567404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      }
31577404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul   }
31587404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul
31594ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   /* check image sizes */
31604ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   if (!ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level,
31613ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick				      proxy_format, choose_format,
31623ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick				      choose_type,
31633ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick				      width, height, depth, border)) {
31647404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      /* See error comment above */
3165d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch      *reason = "invalid width, height or format";
31667404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      return GL_INVALID_OPERATION;
31674ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   }
316889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
31694ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   /* check image size in bytes */
31707404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul   if (expectedSize != imageSize) {
31717404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul      /* Per GL_ARB_texture_compression:  GL_INVALID_VALUE is generated [...]
31727404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul       * if <imageSize> is not consistent with the format, dimensions, and
31737404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul       * contents of the specified image.
31747404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul       */
3175d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch      *reason = "imageSize inconsistant with width/height/format";
317689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_VALUE;
31777404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul   }
317889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3179a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul   if (!mutable_tex_object(ctx, target)) {
3180a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul      *reason = "immutable texture";
3181a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul      return GL_INVALID_OPERATION;
3182a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul   }
3183a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul
318489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   return GL_NO_ERROR;
318589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
318689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
318789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
318889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
318989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Error checking for glCompressedTexSubImage[123]D().
31902371033bbaf6e7477bfa893654a0467a084f335bBrian Paul * \warning  There are some bad assumptions here about the size of compressed
31912371033bbaf6e7477bfa893654a0467a084f335bBrian Paul *           texture tiles (multiple of 4) used to test the validity of the
31922371033bbaf6e7477bfa893654a0467a084f335bBrian Paul *           offset and size parameters.
319389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * \return error code or GL_NO_ERROR.
319489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
319589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulstatic GLenum
3196f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompressed_subtexture_error_check(struct gl_context *ctx, GLint dimensions,
319789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                  GLenum target, GLint level,
319889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                  GLint xoffset, GLint yoffset, GLint zoffset,
319989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                  GLsizei width, GLsizei height, GLsizei depth,
320089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                  GLenum format, GLsizei imageSize)
320189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
320289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLint expectedSize, maxLevels = 0, maxTextureSize;
320307ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul   GLuint bw, bh;
3204a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) zoffset;
320589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
320689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   if (dimensions == 1) {
320789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      /* 1D compressed textures not allowed */
320889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_ENUM;
320989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
321089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   else if (dimensions == 2) {
321189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      if (target == GL_PROXY_TEXTURE_2D) {
321289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         maxLevels = ctx->Const.MaxTextureLevels;
321389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
321489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      else if (target == GL_TEXTURE_2D) {
321589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         maxLevels = ctx->Const.MaxTextureLevels;
321689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
321789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      else if (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) {
321889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         if (!ctx->Extensions.ARB_texture_cube_map)
321989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul            return GL_INVALID_ENUM; /*target*/
322089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         maxLevels = ctx->Const.MaxCubeTextureLevels;
322189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
32222efa3d4f9fd1e1683c5366d402d8740ecfb688e5Brian Paul      else if (_mesa_is_cube_face(target)) {
322389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         if (!ctx->Extensions.ARB_texture_cube_map)
322489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul            return GL_INVALID_ENUM; /*target*/
322589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         maxLevels = ctx->Const.MaxCubeTextureLevels;
322689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
322789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      else {
322889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         return GL_INVALID_ENUM; /*target*/
322989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
323089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
323189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   else if (dimensions == 3) {
323289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      /* 3D compressed textures not allowed */
323389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_ENUM;
323489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
323589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
323689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   maxTextureSize = 1 << (maxLevels - 1);
323789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3238c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul   /* this will catch any invalid compressed format token */
3239c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   if (!_mesa_is_compressed_format(ctx, format))
324089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_ENUM;
324189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3242887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul   if (width < 1 || width > maxTextureSize)
324389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_VALUE;
324489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3245887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul   if ((height < 1 || height > maxTextureSize)
324689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul       && dimensions > 1)
324789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_VALUE;
324889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
324989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   if (level < 0 || level >= maxLevels)
325089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_VALUE;
325189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
325207ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul   /*
325307ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul    * do checks which depend on compression block size
32542371033bbaf6e7477bfa893654a0467a084f335bBrian Paul    */
325507ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul   get_compressed_block_size(format, &bw, &bh);
325607ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul
325707ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul   if ((xoffset % bw != 0) || (yoffset % bh != 0))
325889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_VALUE;
325989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
326007ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul   if ((width % bw != 0) && width != 2 && width != 1)
326189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_VALUE;
326289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
326307ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul   if ((height % bh != 0) && height != 2 && height != 1)
326489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_VALUE;
326589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
326654bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul   expectedSize = compressed_tex_size(width, height, depth, format);
326789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   if (expectedSize != imageSize)
326889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return GL_INVALID_VALUE;
326989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
327089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   return GL_NO_ERROR;
327189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
327289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
327389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3274f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul/**
3275f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul * Do second part of glCompressedTexSubImage error checking.
3276f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul * \return GL_TRUE if error found, GL_FALSE otherwise.
3277f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul */
3278f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paulstatic GLboolean
3279f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompressed_subtexture_error_check2(struct gl_context *ctx, GLuint dims,
3280f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul                                   GLsizei width, GLsizei height,
3281f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul                                   GLsizei depth, GLenum format,
3282f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul                                   struct gl_texture_image *texImage)
3283f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul{
3284f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul
3285f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul   if ((GLint) format != texImage->InternalFormat) {
3286f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION,
3287f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul                  "glCompressedTexSubImage%uD(format=0x%x)", dims, format);
3288f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul      return GL_TRUE;
3289f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul   }
3290f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul
3291d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu   if (compressedteximage_only_format(ctx, format)) {
3292d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      _mesa_error(ctx, GL_INVALID_OPERATION,
3293d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu                  "glCompressedTexSubImage%uD(format=0x%x cannot be updated)"
3294d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu                  , dims, format);
3295d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      return GL_TRUE;
3296d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu   }
3297d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu
3298f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul   if (((width == 1 || width == 2) &&
3299ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul        width != (GLsizei) texImage->Width) ||
3300ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul       (width > (GLsizei) texImage->Width)) {
3301f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
3302f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul                  "glCompressedTexSubImage%uD(width=%d)", dims, width);
3303f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul      return GL_TRUE;
3304f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul   }
3305f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul
3306f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul   if (dims >= 2) {
3307f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul      if (((height == 1 || height == 2) &&
3308ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul           height != (GLsizei) texImage->Height) ||
3309ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul          (height > (GLsizei) texImage->Height)) {
3310f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
3311f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul                     "glCompressedTexSubImage%uD(height=%d)", dims, height);
3312f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul         return GL_TRUE;
3313f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul      }
3314f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul   }
3315f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul
3316f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul   if (dims >= 3) {
3317f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul      if (((depth == 1 || depth == 2) &&
3318ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul           depth != (GLsizei) texImage->Depth) ||
3319ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul          (depth > (GLsizei) texImage->Depth)) {
3320f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
3321f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul                     "glCompressedTexSubImage%uD(depth=%d)", dims, depth);
3322f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul         return GL_TRUE;
3323f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul      }
3324f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul   }
3325f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul
3326f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul   return GL_FALSE;
3327f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul}
3328f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul
3329f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul
33304ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul/**
33314ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul * Implementation of the glCompressedTexImage1/2/3D() functions.
33324ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul */
33334ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paulstatic void
33344ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paulcompressedteximage(struct gl_context *ctx, GLuint dims,
33354ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                   GLenum target, GLint level,
33364ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                   GLenum internalFormat, GLsizei width,
33374ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                   GLsizei height, GLsizei depth, GLint border,
33384ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                   GLsizei imageSize, const GLvoid *data)
33391207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{
33404ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   GLenum error;
3341d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch   char *reason = "";
33424ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul
3343cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3344aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul
3345d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
33464ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      _mesa_debug(ctx,
33474ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  "glCompressedTexImage%uDARB %s %d %s %d %d %d %d %d %p\n",
33484ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  dims,
3349d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora                  _mesa_lookup_enum_by_nr(target), level,
3350d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora                  _mesa_lookup_enum_by_nr(internalFormat),
33514ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  width, height, depth, border, imageSize, data);
33525ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
33534ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   /* check target */
33547404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul   if (!legal_teximage_target(ctx, dims, target)) {
33554ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage%uD(target=%s)",
33564ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  dims, _mesa_lookup_enum_by_nr(target));
3357aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul      return;
3358aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul   }
33591207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul
33604ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   error = compressed_texture_error_check(ctx, dims, target, level,
33614ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                          internalFormat, width, height, depth,
3362d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch                                          border, imageSize, &reason);
3363d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora
33644ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   if (error) {
3365ca7510bbf9bdff35f813f970e3120a9c7f728ccaBrian Paul      _mesa_error(ctx, error, "glCompressedTexImage%uD(%s)", dims, reason);
33667179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg      return;
33677179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg   }
33687179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg
3369af0e2ef8cc5c823e3c950233a09b8de87933a363Brian Paul#if FEATURE_ES
3370af0e2ef8cc5c823e3c950233a09b8de87933a363Brian Paul   /* XXX this is kind of a hack */
33714ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   if (dims == 2) {
33724ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      switch (internalFormat) {
33734ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      case GL_PALETTE4_RGB8_OES:
33744ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      case GL_PALETTE4_RGBA8_OES:
33754ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      case GL_PALETTE4_R5_G6_B5_OES:
33764ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      case GL_PALETTE4_RGBA4_OES:
33774ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      case GL_PALETTE4_RGB5_A1_OES:
33784ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      case GL_PALETTE8_RGB8_OES:
33794ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      case GL_PALETTE8_RGBA8_OES:
33804ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      case GL_PALETTE8_R5_G6_B5_OES:
33814ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      case GL_PALETTE8_RGBA4_OES:
33824ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      case GL_PALETTE8_RGB5_A1_OES:
33834ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul         _mesa_cpal_compressed_teximage2d(target, level, internalFormat,
33844ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                          width, height, imageSize, data);
338589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         return;
3386aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul      }
33874ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   }
33884ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul#endif
3389aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul
33904ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   if (_mesa_is_proxy_texture(target)) {
33914ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      /* Proxy texture: just check for errors and update proxy state */
33924ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      struct gl_texture_image *texImage;
33932914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
33948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul      if (!error) {
33954ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul         struct gl_texture_object *texObj =
33964ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul            _mesa_get_current_tex_object(ctx, target);
33974ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul         gl_format texFormat =
33984ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul            _mesa_choose_texture_format(ctx, texObj, target, level,
33994ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                        internalFormat, GL_NONE, GL_NONE);
34004ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul         if (!legal_texture_size(ctx, texFormat, width, height, depth)) {
34014ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul            error = GL_OUT_OF_MEMORY;
34024ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul         }
3403aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul      }
34045ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
34054ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      texImage = _mesa_get_proxy_tex_image(ctx, target, level);
34064ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul      if (texImage) {
34074ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul         if (error) {
34084ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul            /* if error, clear all proxy texture image parameters */
34094ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul            clear_teximage_fields(texImage);
34104ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul         }
34114ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul         else {
34124ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul            /* no error: store the teximage parameters */
34134ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul            _mesa_init_teximage_fields(ctx, target, texImage, width, height,
34144ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                       depth, border, internalFormat,
34154ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                       MESA_FORMAT_NONE);
34164ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul         }
341789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      }
3418aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul   }
3419aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul   else {
34208c3ddf4270ff075ee783a67e5d5d04fa16a9cb45Brian Paul      /* non-proxy target */
3421aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul      struct gl_texture_object *texObj;
3422aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul      struct gl_texture_image *texImage;
34234ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul
342489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      if (error) {
34254ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul         _mesa_error(ctx, error, "glCompressedTexImage%uD", dims);
342689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul         return;
3427aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul      }
3428aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul
3429b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul      texObj = _mesa_get_current_tex_object(ctx, target);
34309519603f7405a1043ea39bf1dfaf4c88529ce2d1Brian Paul
34315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      _mesa_lock_texture(ctx, texObj);
34325ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      {
34335ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell	 texImage = _mesa_get_tex_image(ctx, texObj, target, level);
34345ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell	 if (!texImage) {
34354ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul	    _mesa_error(ctx, GL_OUT_OF_MEMORY,
34364ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                        "glCompressedTexImage%uD", dims);
34375ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell	 }
3438c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul         else {
343983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul            gl_format texFormat;
344083e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul
344168f8cf72638e974a5bf2ae3e88c2e3539d88e2b6Eric Anholt            ctx->Driver.FreeTextureImageBuffer(ctx, texImage);
3442c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul
344383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul            texFormat = _mesa_choose_texture_format(ctx, texObj, target, level,
344483e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul                                                    internalFormat, GL_NONE,
344583e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul                                                    GL_NONE);
344683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul
34474b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            if (legal_texture_size(ctx, texFormat, width, height, depth)) {
34484b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul               _mesa_init_teximage_fields(ctx, target, texImage,
34494b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul                                          width, height, depth,
34504b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul                                          border, internalFormat, texFormat);
345111caea687e3f10ae12d33e44edf84635f73047ddBrian Paul
34524ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul               switch (dims) {
34534ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul               case 1:
34544ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  ASSERT(ctx->Driver.CompressedTexImage1D);
34554ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  ctx->Driver.CompressedTexImage1D(ctx, target, level,
34564ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   internalFormat,
34574ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   width,
34584ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   border, imageSize, data,
34594ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   texObj, texImage);
34604ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  break;
34614ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul               case 2:
34624ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  ASSERT(ctx->Driver.CompressedTexImage2D);
34634ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  ctx->Driver.CompressedTexImage2D(ctx, target, level,
34644ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   internalFormat,
34654ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   width, height,
34664ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   border, imageSize, data,
34674ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   texObj, texImage);
34684ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  break;
34694ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul               case 3:
34704ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  ASSERT(ctx->Driver.CompressedTexImage3D);
34714ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  ctx->Driver.CompressedTexImage3D(ctx, target, level,
34724ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   internalFormat,
34734ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   width, height, depth,
34744ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   border, imageSize, data,
34754ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                                                   texObj, texImage);
34764ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  break;
34774ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul               default:
34784ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                  _mesa_problem(ctx, "bad dims in compressedteximage");
34794ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul               }
3480c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul
34814b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul               check_gen_mipmap(ctx, target, texObj, level);
34822914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
34834b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul               /* state update */
34844b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul               texObj->_Complete = GL_FALSE;
34854b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul               ctx->NewState |= _NEW_TEXTURE;
34864b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            }
34874b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            else {
34884ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul               _mesa_error(ctx, GL_OUT_OF_MEMORY,
34894ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                           "glCompressedTexImage%uD", dims);
34904b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul            }
3491c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul         }
3492c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul      }
34935ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      _mesa_unlock_texture(ctx, texObj);
3494aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul   }
34954ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul}
34969519603f7405a1043ea39bf1dfaf4c88529ce2d1Brian Paul
34979519603f7405a1043ea39bf1dfaf4c88529ce2d1Brian Paul
34984ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paulvoid GLAPIENTRY
34994ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul_mesa_CompressedTexImage1DARB(GLenum target, GLint level,
35004ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                              GLenum internalFormat, GLsizei width,
35014ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                              GLint border, GLsizei imageSize,
35024ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                              const GLvoid *data)
35034ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul{
35044ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   GET_CURRENT_CONTEXT(ctx);
35054ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   compressedteximage(ctx, 1, target, level, internalFormat,
35064ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                      width, 1, 1, border, imageSize, data);
35074ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul}
35084ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul
35094ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul
35104ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paulvoid GLAPIENTRY
35114ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul_mesa_CompressedTexImage2DARB(GLenum target, GLint level,
35124ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                              GLenum internalFormat, GLsizei width,
35134ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                              GLsizei height, GLint border, GLsizei imageSize,
35144ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                              const GLvoid *data)
35154ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul{
35164ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   GET_CURRENT_CONTEXT(ctx);
35174ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   compressedteximage(ctx, 2, target, level, internalFormat,
35184ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                      width, height, 1, border, imageSize, data);
35194ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul}
35204ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul
35214ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul
35224ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paulvoid GLAPIENTRY
35234ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul_mesa_CompressedTexImage3DARB(GLenum target, GLint level,
35244ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                              GLenum internalFormat, GLsizei width,
35254ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                              GLsizei height, GLsizei depth, GLint border,
35264ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                              GLsizei imageSize, const GLvoid *data)
35274ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul{
35284ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   GET_CURRENT_CONTEXT(ctx);
35294ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul   compressedteximage(ctx, 3, target, level, internalFormat,
35304ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul                      width, height, depth, border, imageSize, data);
35311207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul}
35321207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul
35331207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul
35346bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul/**
35356bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul * Common helper for glCompressedTexSubImage1/2/3D().
35366bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul */
35376bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paulstatic void
35386bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paulcompressed_tex_sub_image(GLuint dims, GLenum target, GLint level,
35396bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                         GLint xoffset, GLint yoffset, GLint zoffset,
35406bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                         GLsizei width, GLsizei height, GLsizei depth,
35416bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                         GLenum format, GLsizei imageSize, const GLvoid *data)
35421207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{
35439540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul   struct gl_texture_object *texObj;
35449540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul   struct gl_texture_image *texImage;
354589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLenum error;
3546a1f1586bcb9fcd4a30930fd14b73323642ce85c5Brian Paul   GET_CURRENT_CONTEXT(ctx);
354775280a2c742ee241d392618a3b29548fce1520a9Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
354875280a2c742ee241d392618a3b29548fce1520a9Brian Paul
35496bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul   error = compressed_subtexture_error_check(ctx, dims, target, level,
3550c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul                                             xoffset, 0, 0, /* pos */
35516bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                             width, height, depth,   /* size */
3552c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul                                             format, imageSize);
355389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   if (error) {
35546bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul      _mesa_error(ctx, error, "glCompressedTexSubImage%uD", dims);
355589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
35569540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul   }
35579540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul
3558b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul   texObj = _mesa_get_current_tex_object(ctx, target);
3559c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul
35605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   _mesa_lock_texture(ctx, texObj);
35615ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   {
35625ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      texImage = _mesa_select_tex_image(ctx, texObj, target, level);
35635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      assert(texImage);
35649540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul
35656bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul      if (compressed_subtexture_error_check2(ctx, dims, width, height, depth,
3566f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul                                             format, texImage)) {
3567f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul         /* error was recorded */
3568c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul      }
35696bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul      else if (width > 0 && height > 0 && depth > 0) {
35706bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul         switch (dims) {
35716bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul         case 1:
35726bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul            if (ctx->Driver.CompressedTexSubImage1D) {
35736bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul               ctx->Driver.CompressedTexSubImage1D(ctx, target, level,
35746bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                                   xoffset, width,
35756bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                                   format, imageSize, data,
35766bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                                   texObj, texImage);
35776bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul            }
35786bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul            break;
35796bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul         case 2:
35806bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul            if (ctx->Driver.CompressedTexSubImage2D) {
35816bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul               ctx->Driver.CompressedTexSubImage2D(ctx, target, level,
35826bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                                   xoffset, yoffset,
35836bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                                   width, height,
35846bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                                   format, imageSize, data,
35856bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                                   texObj, texImage);
35866bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul            }
35876bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul            break;
35886bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul         case 3:
35896bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul            if (ctx->Driver.CompressedTexSubImage3D) {
35906bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul               ctx->Driver.CompressedTexSubImage3D(ctx, target, level,
35916bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                                   xoffset, yoffset, zoffset,
35926bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                                   width, height, depth,
35936bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                                   format, imageSize, data,
35946bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                                   texObj, texImage);
35956bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul            }
35966bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul            break;
35976bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul         default:
35986bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul            ;
3599c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul         }
36002914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
36012914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul         check_gen_mipmap(ctx, target, texObj, level);
36022914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul
36032914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul         ctx->NewState |= _NEW_TEXTURE;
36045ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell      }
36059540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul   }
36065ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   _mesa_unlock_texture(ctx, texObj);
36071207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul}
36081207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul
36091207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul
3610c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
36116bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul_mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset,
36126bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                 GLsizei width, GLenum format,
36136bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                                 GLsizei imageSize, const GLvoid *data)
36146bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul{
36156bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul   compressed_tex_sub_image(1, target, level, xoffset, 0, 0, width, 1, 1,
36166bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                            format, imageSize, data);
36176bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul}
36186bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul
36196bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul
36206bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paulvoid GLAPIENTRY
36211207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul_mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset,
36221207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul                                 GLint yoffset, GLsizei width, GLsizei height,
36231207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul                                 GLenum format, GLsizei imageSize,
36241207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul                                 const GLvoid *data)
36251207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{
36266bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul   compressed_tex_sub_image(2, target, level, xoffset, yoffset, 0,
36276bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                            width, height, 1, format, imageSize, data);
36281207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul}
36291207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul
36301207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul
3631c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
36321207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul_mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset,
36331207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul                                 GLint yoffset, GLint zoffset, GLsizei width,
36341207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul                                 GLsizei height, GLsizei depth, GLenum format,
36351207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul                                 GLsizei imageSize, const GLvoid *data)
36361207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{
36376bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul   compressed_tex_sub_image(3, target, level, xoffset, yoffset, zoffset,
36386bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul                            width, height, depth, format, imageSize, data);
36391207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul}
3640874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3641874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3642874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul/**
3643874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul * Helper for glTexBuffer().  Check if internalFormat is legal.  If so,
3644874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul * return the basic data type and number of components for the format.
3645874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul * \param return  GL_TRUE if internalFormat is legal, GL_FALSE otherwise
3646874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul */
3647874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paulstatic GLboolean
3648874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paulget_sized_format_info(const struct gl_context *ctx, GLenum internalFormat,
3649874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul                      GLenum *datatype, GLuint *components)
3650874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul{
3651874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   switch (internalFormat) {
3652874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_ALPHA8:
3653874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_BYTE;
3654874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3655874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3656874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_ALPHA16:
3657874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_SHORT;
3658874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3659874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3660874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_ALPHA16F_ARB:
3661874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_HALF_FLOAT;
3662874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3663874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3664874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_ALPHA32F_ARB:
3665874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_FLOAT;
3666874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3667874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3668874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_ALPHA8I_EXT:
3669874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_BYTE;
3670874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3671874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3672874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_ALPHA16I_EXT:
3673874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_SHORT;
3674874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3675874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3676874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_ALPHA32I_EXT:
3677874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_INT;
3678874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3679874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3680874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_ALPHA8UI_EXT:
3681874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_BYTE;
3682874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3683874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3684874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_ALPHA16UI_EXT:
3685874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_SHORT;
3686874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3687874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3688874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_ALPHA32UI_EXT:
3689874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_INT;
3690874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3691874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3692874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE8:
3693874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_BYTE;
3694874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3695874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3696874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE16:
3697874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_SHORT;
3698874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3699874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3700874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE16F_ARB:
3701874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_HALF_FLOAT;
3702874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3703874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3704874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE32F_ARB:
3705874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_FLOAT;
3706874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3707874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3708874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE8I_EXT:
3709874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_BYTE;
3710874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3711874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3712874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE16I_EXT:
3713874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_SHORT;
3714874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3715874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3716874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE32I_EXT:
3717874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_INT;
3718874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3719874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3720874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE8UI_EXT:
3721874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_BYTE;
3722874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3723874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3724874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE16UI_EXT:
3725874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_SHORT;
3726874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3727874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3728874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE32UI_EXT:
3729874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_INT;
3730874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3731874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3732874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE8_ALPHA8:
3733874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_BYTE;
3734874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 2;
3735874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3736874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE16_ALPHA16:
3737874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_SHORT;
3738874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 2;
3739874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3740874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE_ALPHA16F_ARB:
3741874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_HALF_FLOAT;
3742874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 2;
3743874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3744874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE_ALPHA32F_ARB:
3745874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_FLOAT;
3746874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 2;
3747874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3748874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE_ALPHA8I_EXT:
3749874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_BYTE;
3750874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 2;
3751874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3752874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE_ALPHA16I_EXT:
3753874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_SHORT;
3754874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 2;
3755874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3756874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE_ALPHA32I_EXT:
3757874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_INT;
3758874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 2;
3759874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3760874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE_ALPHA8UI_EXT:
3761874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_BYTE;
3762874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 2;
3763874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3764874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE_ALPHA16UI_EXT:
3765874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_SHORT;
3766874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 2;
3767874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3768874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_LUMINANCE_ALPHA32UI_EXT:
3769874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_INT;
3770874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 2;
3771874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3772874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_INTENSITY8:
3773874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_BYTE;
3774874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3775874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3776874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_INTENSITY16:
3777874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_SHORT;
3778874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3779874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3780874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_INTENSITY16F_ARB:
3781874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_HALF_FLOAT;
3782874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3783874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3784874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_INTENSITY32F_ARB:
3785874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_FLOAT;
3786874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3787874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3788874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_INTENSITY8I_EXT:
3789874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_BYTE;
3790874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3791874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3792874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_INTENSITY16I_EXT:
3793874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_SHORT;
3794874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3795874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3796874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_INTENSITY32I_EXT:
3797874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_INT;
3798874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3799874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3800874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_INTENSITY8UI_EXT:
3801874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_BYTE;
3802874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3803874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3804874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_INTENSITY16UI_EXT:
3805874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_SHORT;
3806874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3807874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3808874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_INTENSITY32UI_EXT:
3809874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_INT;
3810874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 1;
3811874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3812874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_RGBA8:
3813874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_BYTE;
3814874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 4;
3815874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3816874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_RGBA16:
3817874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_SHORT;
3818874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 4;
3819874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3820874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_RGBA16F_ARB:
3821874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_HALF_FLOAT;
3822874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 4;
3823874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3824874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_RGBA32F_ARB:
3825874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_FLOAT;
3826874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 4;
3827874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3828874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_RGBA8I_EXT:
3829874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_BYTE;
3830874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 4;
3831874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3832874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_RGBA16I_EXT:
3833874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_SHORT;
3834874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 4;
3835874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3836874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_RGBA32I_EXT:
3837874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_INT;
3838874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 4;
3839874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3840874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_RGBA8UI_EXT:
3841874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_BYTE;
3842874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 4;
3843874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3844874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_RGBA16UI_EXT:
3845874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_SHORT;
3846874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 4;
3847874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3848874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   case GL_RGBA32UI_EXT:
3849874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *datatype = GL_UNSIGNED_INT;
3850874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      *components = 4;
3851874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      break;
3852874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   default:
3853874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      return GL_FALSE;
3854874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   }
3855874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3856874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   if (*datatype == GL_FLOAT && !ctx->Extensions.ARB_texture_float)
3857874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      return GL_FALSE;
3858874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3859874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   if (*datatype == GL_HALF_FLOAT && !ctx->Extensions.ARB_half_float_pixel)
3860874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      return GL_FALSE;
3861874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3862874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   return GL_TRUE;
3863874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul}
3864874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3865874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3866874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul/** GL_ARB_texture_buffer_object */
3867874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paulvoid GLAPIENTRY
3868874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul_mesa_TexBuffer(GLenum target, GLenum internalFormat, GLuint buffer)
3869874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul{
3870874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   struct gl_texture_object *texObj;
3871874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   struct gl_buffer_object *bufObj;
3872874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   GLenum dataType;
3873874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   GLuint comps;
3874874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3875874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   GET_CURRENT_CONTEXT(ctx);
3876874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3877874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3878874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   if (!ctx->Extensions.ARB_texture_buffer_object) {
3879874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBuffer");
3880874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      return;
3881874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   }
3882874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3883874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   if (target != GL_TEXTURE_BUFFER_ARB) {
3884874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glTexBuffer(target)");
3885874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      return;
3886874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   }
3887874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3888874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   if (!get_sized_format_info(ctx, internalFormat, &dataType, &comps)) {
3889874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glTexBuffer(internalFormat 0x%x)",
3890874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul                  internalFormat);
3891874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      return;
3892874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   }
3893874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3894874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   bufObj = _mesa_lookup_bufferobj(ctx, buffer);
3895874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   if (buffer && !bufObj) {
3896874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBuffer(buffer %u)", buffer);
3897874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      return;
3898874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   }
3899874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3900874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   texObj = _mesa_get_current_tex_object(ctx, target);
3901874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
3902874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   _mesa_lock_texture(ctx, texObj);
3903874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   {
3904874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      _mesa_reference_buffer_object(ctx, &texObj->BufferObject, bufObj);
3905874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul      texObj->BufferObjectFormat = internalFormat;
3906874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   }
3907874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   _mesa_unlock_texture(ctx, texObj);
3908874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul}
3909