texparam.c revision c1f859d4
1c1f859d4Smrg/*
2c1f859d4Smrg * Mesa 3-D graphics library
3c1f859d4Smrg * Version:  7.5
4c1f859d4Smrg *
5c1f859d4Smrg * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6c1f859d4Smrg * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
7c1f859d4Smrg *
8c1f859d4Smrg * Permission is hereby granted, free of charge, to any person obtaining a
9c1f859d4Smrg * copy of this software and associated documentation files (the "Software"),
10c1f859d4Smrg * to deal in the Software without restriction, including without limitation
11c1f859d4Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12c1f859d4Smrg * and/or sell copies of the Software, and to permit persons to whom the
13c1f859d4Smrg * Software is furnished to do so, subject to the following conditions:
14c1f859d4Smrg *
15c1f859d4Smrg * The above copyright notice and this permission notice shall be included
16c1f859d4Smrg * in all copies or substantial portions of the Software.
17c1f859d4Smrg *
18c1f859d4Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19c1f859d4Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20c1f859d4Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21c1f859d4Smrg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22c1f859d4Smrg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23c1f859d4Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24c1f859d4Smrg */
25c1f859d4Smrg
26c1f859d4Smrg/**
27c1f859d4Smrg * \file texparam.c
28c1f859d4Smrg *
29c1f859d4Smrg * glTexParameter-related functions
30c1f859d4Smrg */
31c1f859d4Smrg
32c1f859d4Smrg
33c1f859d4Smrg#include "main/glheader.h"
34c1f859d4Smrg#include "main/context.h"
35c1f859d4Smrg#include "main/enums.h"
36c1f859d4Smrg#include "main/colormac.h"
37c1f859d4Smrg#include "main/macros.h"
38c1f859d4Smrg#include "main/texcompress.h"
39c1f859d4Smrg#include "main/texparam.h"
40c1f859d4Smrg#include "main/teximage.h"
41c1f859d4Smrg
42c1f859d4Smrg
43c1f859d4Smrg/**
44c1f859d4Smrg * Check if a coordinate wrap mode is supported for the texture target.
45c1f859d4Smrg * \return GL_TRUE if legal, GL_FALSE otherwise
46c1f859d4Smrg */
47c1f859d4Smrgstatic GLboolean
48c1f859d4Smrgvalidate_texture_wrap_mode(GLcontext * ctx, GLenum target, GLenum wrap)
49c1f859d4Smrg{
50c1f859d4Smrg   const struct gl_extensions * const e = & ctx->Extensions;
51c1f859d4Smrg
52c1f859d4Smrg   if (wrap == GL_CLAMP || wrap == GL_CLAMP_TO_EDGE ||
53c1f859d4Smrg       (wrap == GL_CLAMP_TO_BORDER && e->ARB_texture_border_clamp)) {
54c1f859d4Smrg      /* any texture target */
55c1f859d4Smrg      return GL_TRUE;
56c1f859d4Smrg   }
57c1f859d4Smrg   else if (target != GL_TEXTURE_RECTANGLE_NV &&
58c1f859d4Smrg	    (wrap == GL_REPEAT ||
59c1f859d4Smrg	     (wrap == GL_MIRRORED_REPEAT &&
60c1f859d4Smrg	      e->ARB_texture_mirrored_repeat) ||
61c1f859d4Smrg	     (wrap == GL_MIRROR_CLAMP_EXT &&
62c1f859d4Smrg	      (e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp)) ||
63c1f859d4Smrg	     (wrap == GL_MIRROR_CLAMP_TO_EDGE_EXT &&
64c1f859d4Smrg	      (e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp)) ||
65c1f859d4Smrg	     (wrap == GL_MIRROR_CLAMP_TO_BORDER_EXT &&
66c1f859d4Smrg	      (e->EXT_texture_mirror_clamp)))) {
67c1f859d4Smrg      /* non-rectangle texture */
68c1f859d4Smrg      return GL_TRUE;
69c1f859d4Smrg   }
70c1f859d4Smrg
71c1f859d4Smrg   _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
72c1f859d4Smrg   return GL_FALSE;
73c1f859d4Smrg}
74c1f859d4Smrg
75c1f859d4Smrg
76c1f859d4Smrg/**
77c1f859d4Smrg * Get current texture object for given target.
78c1f859d4Smrg * Return NULL if any error.
79c1f859d4Smrg */
80c1f859d4Smrgstatic struct gl_texture_object *
81c1f859d4Smrgget_texobj(GLcontext *ctx, GLenum target)
82c1f859d4Smrg{
83c1f859d4Smrg   struct gl_texture_unit *texUnit;
84c1f859d4Smrg
85c1f859d4Smrg   if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
86c1f859d4Smrg      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameter(current unit)");
87c1f859d4Smrg      return NULL;
88c1f859d4Smrg   }
89c1f859d4Smrg
90c1f859d4Smrg   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
91c1f859d4Smrg
92c1f859d4Smrg   switch (target) {
93c1f859d4Smrg   case GL_TEXTURE_1D:
94c1f859d4Smrg      return texUnit->CurrentTex[TEXTURE_1D_INDEX];
95c1f859d4Smrg   case GL_TEXTURE_2D:
96c1f859d4Smrg      return texUnit->CurrentTex[TEXTURE_2D_INDEX];
97c1f859d4Smrg   case GL_TEXTURE_3D:
98c1f859d4Smrg      return texUnit->CurrentTex[TEXTURE_3D_INDEX];
99c1f859d4Smrg   case GL_TEXTURE_CUBE_MAP:
100c1f859d4Smrg      if (ctx->Extensions.ARB_texture_cube_map) {
101c1f859d4Smrg         return texUnit->CurrentTex[TEXTURE_CUBE_INDEX];
102c1f859d4Smrg      }
103c1f859d4Smrg      break;
104c1f859d4Smrg   case GL_TEXTURE_RECTANGLE_NV:
105c1f859d4Smrg      if (ctx->Extensions.NV_texture_rectangle) {
106c1f859d4Smrg         return texUnit->CurrentTex[TEXTURE_RECT_INDEX];
107c1f859d4Smrg      }
108c1f859d4Smrg      break;
109c1f859d4Smrg   case GL_TEXTURE_1D_ARRAY_EXT:
110c1f859d4Smrg      if (ctx->Extensions.MESA_texture_array) {
111c1f859d4Smrg         return texUnit->CurrentTex[TEXTURE_1D_ARRAY_INDEX];
112c1f859d4Smrg      }
113c1f859d4Smrg      break;
114c1f859d4Smrg   case GL_TEXTURE_2D_ARRAY_EXT:
115c1f859d4Smrg      if (ctx->Extensions.MESA_texture_array) {
116c1f859d4Smrg         return texUnit->CurrentTex[TEXTURE_2D_ARRAY_INDEX];
117c1f859d4Smrg      }
118c1f859d4Smrg      break;
119c1f859d4Smrg   default:
120c1f859d4Smrg      ;
121c1f859d4Smrg   }
122c1f859d4Smrg
123c1f859d4Smrg   _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(target)");
124c1f859d4Smrg   return NULL;
125c1f859d4Smrg}
126c1f859d4Smrg
127c1f859d4Smrg
128c1f859d4Smrg/**
129c1f859d4Smrg * This is called just prior to changing any texture object state.
130c1f859d4Smrg * Any pending rendering will be flushed out, we'll set the _NEW_TEXTURE
131c1f859d4Smrg * state flag and then mark the texture object as 'incomplete' so that any
132c1f859d4Smrg * per-texture derived state gets recomputed.
133c1f859d4Smrg */
134c1f859d4Smrgstatic INLINE void
135c1f859d4Smrgflush(GLcontext *ctx, struct gl_texture_object *texObj)
136c1f859d4Smrg{
137c1f859d4Smrg   FLUSH_VERTICES(ctx, _NEW_TEXTURE);
138c1f859d4Smrg   texObj->_Complete = GL_FALSE;
139c1f859d4Smrg}
140c1f859d4Smrg
141c1f859d4Smrg
142c1f859d4Smrg/**
143c1f859d4Smrg * Set an integer-valued texture parameter
144c1f859d4Smrg * \return GL_TRUE if legal AND the value changed, GL_FALSE otherwise
145c1f859d4Smrg */
146c1f859d4Smrgstatic GLboolean
147c1f859d4Smrgset_tex_parameteri(GLcontext *ctx,
148c1f859d4Smrg                   struct gl_texture_object *texObj,
149c1f859d4Smrg                   GLenum pname, const GLint *params)
150c1f859d4Smrg{
151c1f859d4Smrg   switch (pname) {
152c1f859d4Smrg   case GL_TEXTURE_MIN_FILTER:
153c1f859d4Smrg      if (texObj->MinFilter == params[0])
154c1f859d4Smrg         return GL_FALSE;
155c1f859d4Smrg      switch (params[0]) {
156c1f859d4Smrg      case GL_NEAREST:
157c1f859d4Smrg      case GL_LINEAR:
158c1f859d4Smrg         flush(ctx, texObj);
159c1f859d4Smrg         texObj->MinFilter = params[0];
160c1f859d4Smrg         return GL_TRUE;
161c1f859d4Smrg      case GL_NEAREST_MIPMAP_NEAREST:
162c1f859d4Smrg      case GL_LINEAR_MIPMAP_NEAREST:
163c1f859d4Smrg      case GL_NEAREST_MIPMAP_LINEAR:
164c1f859d4Smrg      case GL_LINEAR_MIPMAP_LINEAR:
165c1f859d4Smrg         if (texObj->Target != GL_TEXTURE_RECTANGLE_NV) {
166c1f859d4Smrg            flush(ctx, texObj);
167c1f859d4Smrg            texObj->MinFilter = params[0];
168c1f859d4Smrg            return GL_TRUE;
169c1f859d4Smrg         }
170c1f859d4Smrg         /* fall-through */
171c1f859d4Smrg      default:
172c1f859d4Smrg         _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
173c1f859d4Smrg      }
174c1f859d4Smrg      return GL_FALSE;
175c1f859d4Smrg
176c1f859d4Smrg   case GL_TEXTURE_MAG_FILTER:
177c1f859d4Smrg      if (texObj->MagFilter == params[0])
178c1f859d4Smrg         return GL_FALSE;
179c1f859d4Smrg      switch (params[0]) {
180c1f859d4Smrg      case GL_NEAREST:
181c1f859d4Smrg      case GL_LINEAR:
182c1f859d4Smrg         flush(ctx, texObj);
183c1f859d4Smrg         texObj->MagFilter = params[0];
184c1f859d4Smrg         return GL_TRUE;
185c1f859d4Smrg      default:
186c1f859d4Smrg         _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
187c1f859d4Smrg      }
188c1f859d4Smrg      return GL_FALSE;
189c1f859d4Smrg
190c1f859d4Smrg   case GL_TEXTURE_WRAP_S:
191c1f859d4Smrg      if (texObj->WrapS == params[0])
192c1f859d4Smrg         return GL_FALSE;
193c1f859d4Smrg      if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
194c1f859d4Smrg         flush(ctx, texObj);
195c1f859d4Smrg         texObj->WrapS = params[0];
196c1f859d4Smrg         return GL_TRUE;
197c1f859d4Smrg      }
198c1f859d4Smrg      return GL_FALSE;
199c1f859d4Smrg
200c1f859d4Smrg   case GL_TEXTURE_WRAP_T:
201c1f859d4Smrg      if (texObj->WrapT == params[0])
202c1f859d4Smrg         return GL_FALSE;
203c1f859d4Smrg      if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
204c1f859d4Smrg         flush(ctx, texObj);
205c1f859d4Smrg         texObj->WrapT = params[0];
206c1f859d4Smrg         return GL_TRUE;
207c1f859d4Smrg      }
208c1f859d4Smrg      return GL_FALSE;
209c1f859d4Smrg
210c1f859d4Smrg   case GL_TEXTURE_WRAP_R:
211c1f859d4Smrg      if (texObj->WrapR == params[0])
212c1f859d4Smrg         return GL_FALSE;
213c1f859d4Smrg      if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
214c1f859d4Smrg         flush(ctx, texObj);
215c1f859d4Smrg         texObj->WrapR = params[0];
216c1f859d4Smrg         return GL_TRUE;
217c1f859d4Smrg      }
218c1f859d4Smrg      return GL_FALSE;
219c1f859d4Smrg
220c1f859d4Smrg   case GL_TEXTURE_BASE_LEVEL:
221c1f859d4Smrg      if (texObj->BaseLevel == params[0])
222c1f859d4Smrg         return GL_FALSE;
223c1f859d4Smrg      if (params[0] < 0 ||
224c1f859d4Smrg          (texObj->Target == GL_TEXTURE_RECTANGLE_ARB && params[0] != 0)) {
225c1f859d4Smrg         _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)");
226c1f859d4Smrg         return GL_FALSE;
227c1f859d4Smrg      }
228c1f859d4Smrg      flush(ctx, texObj);
229c1f859d4Smrg      texObj->BaseLevel = params[0];
230c1f859d4Smrg      return GL_TRUE;
231c1f859d4Smrg
232c1f859d4Smrg   case GL_TEXTURE_MAX_LEVEL:
233c1f859d4Smrg      if (texObj->MaxLevel == params[0])
234c1f859d4Smrg         return GL_FALSE;
235c1f859d4Smrg      if (params[0] < 0 || texObj->Target == GL_TEXTURE_RECTANGLE_ARB) {
236c1f859d4Smrg         _mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameter(param)");
237c1f859d4Smrg         return GL_FALSE;
238c1f859d4Smrg      }
239c1f859d4Smrg      flush(ctx, texObj);
240c1f859d4Smrg      texObj->MaxLevel = params[0];
241c1f859d4Smrg      return GL_TRUE;
242c1f859d4Smrg
243c1f859d4Smrg   case GL_TEXTURE_COMPARE_SGIX:
244c1f859d4Smrg      if (ctx->Extensions.SGIX_shadow) {
245c1f859d4Smrg         FLUSH_VERTICES(ctx, _NEW_TEXTURE);
246c1f859d4Smrg         texObj->CompareFlag = params[0] ? GL_TRUE : GL_FALSE;
247c1f859d4Smrg      }
248c1f859d4Smrg      else {
249c1f859d4Smrg         _mesa_error(ctx, GL_INVALID_ENUM,
250c1f859d4Smrg                     "glTexParameter(pname=GL_TEXTURE_COMPARE_SGIX)");
251c1f859d4Smrg      }
252c1f859d4Smrg      return GL_TRUE;
253c1f859d4Smrg
254c1f859d4Smrg   case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
255c1f859d4Smrg      if (ctx->Extensions.SGIX_shadow &&
256c1f859d4Smrg          (params[0] == GL_TEXTURE_LEQUAL_R_SGIX ||
257c1f859d4Smrg           params[0] == GL_TEXTURE_GEQUAL_R_SGIX)) {
258c1f859d4Smrg         FLUSH_VERTICES(ctx, _NEW_TEXTURE);
259c1f859d4Smrg         texObj->CompareOperator = params[0];
260c1f859d4Smrg      }
261c1f859d4Smrg      else {
262c1f859d4Smrg         _mesa_error(ctx, GL_INVALID_ENUM,
263c1f859d4Smrg                     "glTexParameter(GL_TEXTURE_COMPARE_OPERATOR_SGIX)");
264c1f859d4Smrg      }
265c1f859d4Smrg      return GL_TRUE;
266c1f859d4Smrg
267c1f859d4Smrg   case GL_GENERATE_MIPMAP_SGIS:
268c1f859d4Smrg      if (ctx->Extensions.SGIS_generate_mipmap) {
269c1f859d4Smrg         if (texObj->GenerateMipmap != params[0]) {
270c1f859d4Smrg            flush(ctx, texObj);
271c1f859d4Smrg            texObj->GenerateMipmap = params[0] ? GL_TRUE : GL_FALSE;
272c1f859d4Smrg            return GL_TRUE;
273c1f859d4Smrg         }
274c1f859d4Smrg         return GL_FALSE;
275c1f859d4Smrg      }
276c1f859d4Smrg      else {
277c1f859d4Smrg         _mesa_error(ctx, GL_INVALID_ENUM,
278c1f859d4Smrg                     "glTexParameter(pname=GL_GENERATE_MIPMAP_SGIS)");
279c1f859d4Smrg      }
280c1f859d4Smrg      return GL_FALSE;
281c1f859d4Smrg
282c1f859d4Smrg   case GL_TEXTURE_COMPARE_MODE_ARB:
283c1f859d4Smrg      if (ctx->Extensions.ARB_shadow &&
284c1f859d4Smrg          (params[0] == GL_NONE ||
285c1f859d4Smrg           params[0] == GL_COMPARE_R_TO_TEXTURE_ARB)) {
286c1f859d4Smrg         if (texObj->CompareMode != params[0]) {
287c1f859d4Smrg            flush(ctx, texObj);
288c1f859d4Smrg            texObj->CompareMode = params[0];
289c1f859d4Smrg            return GL_TRUE;
290c1f859d4Smrg         }
291c1f859d4Smrg         return GL_FALSE;
292c1f859d4Smrg      }
293c1f859d4Smrg      else {
294c1f859d4Smrg         _mesa_error(ctx, GL_INVALID_ENUM,
295c1f859d4Smrg                     "glTexParameter(GL_TEXTURE_COMPARE_MODE_ARB)");
296c1f859d4Smrg      }
297c1f859d4Smrg      return GL_FALSE;
298c1f859d4Smrg
299c1f859d4Smrg   case GL_TEXTURE_COMPARE_FUNC_ARB:
300c1f859d4Smrg      if (ctx->Extensions.ARB_shadow) {
301c1f859d4Smrg         if (texObj->CompareFunc == params[0])
302c1f859d4Smrg            return GL_FALSE;
303c1f859d4Smrg         switch (params[0]) {
304c1f859d4Smrg         case GL_LEQUAL:
305c1f859d4Smrg         case GL_GEQUAL:
306c1f859d4Smrg            flush(ctx, texObj);
307c1f859d4Smrg            texObj->CompareFunc = params[0];
308c1f859d4Smrg            return GL_TRUE;
309c1f859d4Smrg         case GL_EQUAL:
310c1f859d4Smrg         case GL_NOTEQUAL:
311c1f859d4Smrg         case GL_LESS:
312c1f859d4Smrg         case GL_GREATER:
313c1f859d4Smrg         case GL_ALWAYS:
314c1f859d4Smrg         case GL_NEVER:
315c1f859d4Smrg            if (ctx->Extensions.EXT_shadow_funcs) {
316c1f859d4Smrg               flush(ctx, texObj);
317c1f859d4Smrg               texObj->CompareFunc = params[0];
318c1f859d4Smrg               return GL_TRUE;
319c1f859d4Smrg            }
320c1f859d4Smrg            /* fall-through */
321c1f859d4Smrg         default:
322c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
323c1f859d4Smrg                        "glTexParameter(GL_TEXTURE_COMPARE_FUNC_ARB)");
324c1f859d4Smrg         }
325c1f859d4Smrg      }
326c1f859d4Smrg      else {
327c1f859d4Smrg         _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(param)");
328c1f859d4Smrg      }
329c1f859d4Smrg      return GL_FALSE;
330c1f859d4Smrg
331c1f859d4Smrg   case GL_DEPTH_TEXTURE_MODE_ARB:
332c1f859d4Smrg      if (ctx->Extensions.ARB_depth_texture &&
333c1f859d4Smrg          (params[0] == GL_LUMINANCE ||
334c1f859d4Smrg           params[0] == GL_INTENSITY ||
335c1f859d4Smrg           params[0] == GL_ALPHA)) {
336c1f859d4Smrg         if (texObj->DepthMode != params[0]) {
337c1f859d4Smrg            flush(ctx, texObj);
338c1f859d4Smrg            texObj->DepthMode = params[0];
339c1f859d4Smrg            return GL_TRUE;
340c1f859d4Smrg         }
341c1f859d4Smrg      }
342c1f859d4Smrg      else {
343c1f859d4Smrg         _mesa_error(ctx, GL_INVALID_ENUM,
344c1f859d4Smrg                     "glTexParameter(GL_DEPTH_TEXTURE_MODE_ARB)");
345c1f859d4Smrg      }
346c1f859d4Smrg      return GL_FALSE;
347c1f859d4Smrg
348c1f859d4Smrg#ifdef FEATURE_OES_draw_texture
349c1f859d4Smrg   case GL_TEXTURE_CROP_RECT_OES:
350c1f859d4Smrg      texObj->CropRect[0] = params[0];
351c1f859d4Smrg      texObj->CropRect[1] = params[1];
352c1f859d4Smrg      texObj->CropRect[2] = params[2];
353c1f859d4Smrg      texObj->CropRect[3] = params[3];
354c1f859d4Smrg      return GL_TRUE;
355c1f859d4Smrg#endif
356c1f859d4Smrg
357c1f859d4Smrg   default:
358c1f859d4Smrg      _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(pname=0x%x)", pname);
359c1f859d4Smrg   }
360c1f859d4Smrg   return GL_FALSE;
361c1f859d4Smrg}
362c1f859d4Smrg
363c1f859d4Smrg
364c1f859d4Smrg/**
365c1f859d4Smrg * Set a float-valued texture parameter
366c1f859d4Smrg * \return GL_TRUE if legal AND the value changed, GL_FALSE otherwise
367c1f859d4Smrg */
368c1f859d4Smrgstatic GLboolean
369c1f859d4Smrgset_tex_parameterf(GLcontext *ctx,
370c1f859d4Smrg                   struct gl_texture_object *texObj,
371c1f859d4Smrg                   GLenum pname, const GLfloat *params)
372c1f859d4Smrg{
373c1f859d4Smrg   switch (pname) {
374c1f859d4Smrg   case GL_TEXTURE_MIN_LOD:
375c1f859d4Smrg      if (texObj->MinLod == params[0])
376c1f859d4Smrg         return GL_FALSE;
377c1f859d4Smrg      flush(ctx, texObj);
378c1f859d4Smrg      texObj->MinLod = params[0];
379c1f859d4Smrg      return GL_TRUE;
380c1f859d4Smrg
381c1f859d4Smrg   case GL_TEXTURE_MAX_LOD:
382c1f859d4Smrg      if (texObj->MaxLod == params[0])
383c1f859d4Smrg         return GL_FALSE;
384c1f859d4Smrg      flush(ctx, texObj);
385c1f859d4Smrg      texObj->MaxLod = params[0];
386c1f859d4Smrg      return GL_TRUE;
387c1f859d4Smrg
388c1f859d4Smrg   case GL_TEXTURE_PRIORITY:
389c1f859d4Smrg      flush(ctx, texObj);
390c1f859d4Smrg      texObj->Priority = CLAMP(params[0], 0.0F, 1.0F);
391c1f859d4Smrg      return GL_TRUE;
392c1f859d4Smrg
393c1f859d4Smrg   case GL_TEXTURE_MAX_ANISOTROPY_EXT:
394c1f859d4Smrg      if (ctx->Extensions.EXT_texture_filter_anisotropic) {
395c1f859d4Smrg         if (texObj->MaxAnisotropy == params[0])
396c1f859d4Smrg            return GL_FALSE;
397c1f859d4Smrg         if (params[0] < 1.0) {
398c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
399c1f859d4Smrg            return GL_FALSE;
400c1f859d4Smrg         }
401c1f859d4Smrg         flush(ctx, texObj);
402c1f859d4Smrg         /* clamp to max, that's what NVIDIA does */
403c1f859d4Smrg         texObj->MaxAnisotropy = MIN2(params[0],
404c1f859d4Smrg                                      ctx->Const.MaxTextureMaxAnisotropy);
405c1f859d4Smrg         return GL_TRUE;
406c1f859d4Smrg      }
407c1f859d4Smrg      else {
408c1f859d4Smrg         _mesa_error(ctx, GL_INVALID_ENUM,
409c1f859d4Smrg                     "glTexParameter(pname=GL_TEXTURE_MAX_ANISOTROPY_EXT)");
410c1f859d4Smrg      }
411c1f859d4Smrg      return GL_FALSE;
412c1f859d4Smrg
413c1f859d4Smrg   case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
414c1f859d4Smrg      if (ctx->Extensions.SGIX_shadow_ambient) {
415c1f859d4Smrg         if (texObj->ShadowAmbient != params[0]) {
416c1f859d4Smrg            flush(ctx, texObj);
417c1f859d4Smrg            texObj->ShadowAmbient = CLAMP(params[0], 0.0F, 1.0F);
418c1f859d4Smrg            return GL_TRUE;
419c1f859d4Smrg         }
420c1f859d4Smrg      }
421c1f859d4Smrg      else {
422c1f859d4Smrg         _mesa_error(ctx, GL_INVALID_ENUM,
423c1f859d4Smrg                     "glTexParameter(pname=GL_SHADOW_AMBIENT_SGIX)");
424c1f859d4Smrg      }
425c1f859d4Smrg      return GL_FALSE;
426c1f859d4Smrg
427c1f859d4Smrg   case GL_TEXTURE_LOD_BIAS:
428c1f859d4Smrg      /* NOTE: this is really part of OpenGL 1.4, not EXT_texture_lod_bias */
429c1f859d4Smrg      if (ctx->Extensions.EXT_texture_lod_bias) {
430c1f859d4Smrg         if (texObj->LodBias != params[0]) {
431c1f859d4Smrg            flush(ctx, texObj);
432c1f859d4Smrg            texObj->LodBias = params[0];
433c1f859d4Smrg            return GL_TRUE;
434c1f859d4Smrg         }
435c1f859d4Smrg         return GL_FALSE;
436c1f859d4Smrg      }
437c1f859d4Smrg      break;
438c1f859d4Smrg
439c1f859d4Smrg   case GL_TEXTURE_BORDER_COLOR:
440c1f859d4Smrg      flush(ctx, texObj);
441c1f859d4Smrg      texObj->BorderColor[RCOMP] = params[0];
442c1f859d4Smrg      texObj->BorderColor[GCOMP] = params[1];
443c1f859d4Smrg      texObj->BorderColor[BCOMP] = params[2];
444c1f859d4Smrg      texObj->BorderColor[ACOMP] = params[3];
445c1f859d4Smrg      UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[RCOMP], params[0]);
446c1f859d4Smrg      UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[GCOMP], params[1]);
447c1f859d4Smrg      UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[BCOMP], params[2]);
448c1f859d4Smrg      UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[ACOMP], params[3]);
449c1f859d4Smrg      return GL_TRUE;
450c1f859d4Smrg
451c1f859d4Smrg   default:
452c1f859d4Smrg      _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(pname=0x%x)", pname);
453c1f859d4Smrg   }
454c1f859d4Smrg   return GL_FALSE;
455c1f859d4Smrg}
456c1f859d4Smrg
457c1f859d4Smrg
458c1f859d4Smrgvoid GLAPIENTRY
459c1f859d4Smrg_mesa_TexParameterf(GLenum target, GLenum pname, GLfloat param)
460c1f859d4Smrg{
461c1f859d4Smrg   GLboolean need_update;
462c1f859d4Smrg   struct gl_texture_object *texObj;
463c1f859d4Smrg   GET_CURRENT_CONTEXT(ctx);
464c1f859d4Smrg   ASSERT_OUTSIDE_BEGIN_END(ctx);
465c1f859d4Smrg
466c1f859d4Smrg   texObj = get_texobj(ctx, target);
467c1f859d4Smrg   if (!texObj)
468c1f859d4Smrg      return;
469c1f859d4Smrg
470c1f859d4Smrg   switch (pname) {
471c1f859d4Smrg   case GL_TEXTURE_MIN_FILTER:
472c1f859d4Smrg   case GL_TEXTURE_MAG_FILTER:
473c1f859d4Smrg   case GL_TEXTURE_WRAP_S:
474c1f859d4Smrg   case GL_TEXTURE_WRAP_T:
475c1f859d4Smrg   case GL_TEXTURE_WRAP_R:
476c1f859d4Smrg   case GL_TEXTURE_BASE_LEVEL:
477c1f859d4Smrg   case GL_TEXTURE_MAX_LEVEL:
478c1f859d4Smrg   case GL_TEXTURE_COMPARE_SGIX:
479c1f859d4Smrg   case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
480c1f859d4Smrg   case GL_GENERATE_MIPMAP_SGIS:
481c1f859d4Smrg   case GL_TEXTURE_COMPARE_MODE_ARB:
482c1f859d4Smrg   case GL_TEXTURE_COMPARE_FUNC_ARB:
483c1f859d4Smrg   case GL_DEPTH_TEXTURE_MODE_ARB:
484c1f859d4Smrg      {
485c1f859d4Smrg         /* convert float param to int */
486c1f859d4Smrg         GLint p = (GLint) param;
487c1f859d4Smrg         need_update = set_tex_parameteri(ctx, texObj, pname, &p);
488c1f859d4Smrg      }
489c1f859d4Smrg      break;
490c1f859d4Smrg   default:
491c1f859d4Smrg      /* this will generate an error if pname is illegal */
492c1f859d4Smrg      need_update = set_tex_parameterf(ctx, texObj, pname, &param);
493c1f859d4Smrg   }
494c1f859d4Smrg
495c1f859d4Smrg   if (ctx->Driver.TexParameter && need_update) {
496c1f859d4Smrg      ctx->Driver.TexParameter(ctx, target, texObj, pname, &param);
497c1f859d4Smrg   }
498c1f859d4Smrg}
499c1f859d4Smrg
500c1f859d4Smrg
501c1f859d4Smrgvoid GLAPIENTRY
502c1f859d4Smrg_mesa_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
503c1f859d4Smrg{
504c1f859d4Smrg   GLboolean need_update;
505c1f859d4Smrg   struct gl_texture_object *texObj;
506c1f859d4Smrg   GET_CURRENT_CONTEXT(ctx);
507c1f859d4Smrg   ASSERT_OUTSIDE_BEGIN_END(ctx);
508c1f859d4Smrg
509c1f859d4Smrg   texObj = get_texobj(ctx, target);
510c1f859d4Smrg   if (!texObj)
511c1f859d4Smrg      return;
512c1f859d4Smrg
513c1f859d4Smrg   switch (pname) {
514c1f859d4Smrg   case GL_TEXTURE_MIN_FILTER:
515c1f859d4Smrg   case GL_TEXTURE_MAG_FILTER:
516c1f859d4Smrg   case GL_TEXTURE_WRAP_S:
517c1f859d4Smrg   case GL_TEXTURE_WRAP_T:
518c1f859d4Smrg   case GL_TEXTURE_WRAP_R:
519c1f859d4Smrg   case GL_TEXTURE_BASE_LEVEL:
520c1f859d4Smrg   case GL_TEXTURE_MAX_LEVEL:
521c1f859d4Smrg   case GL_TEXTURE_COMPARE_SGIX:
522c1f859d4Smrg   case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
523c1f859d4Smrg   case GL_GENERATE_MIPMAP_SGIS:
524c1f859d4Smrg   case GL_TEXTURE_COMPARE_MODE_ARB:
525c1f859d4Smrg   case GL_TEXTURE_COMPARE_FUNC_ARB:
526c1f859d4Smrg   case GL_DEPTH_TEXTURE_MODE_ARB:
527c1f859d4Smrg      {
528c1f859d4Smrg         /* convert float param to int */
529c1f859d4Smrg         GLint p = (GLint) params[0];
530c1f859d4Smrg         need_update = set_tex_parameteri(ctx, texObj, pname, &p);
531c1f859d4Smrg      }
532c1f859d4Smrg      break;
533c1f859d4Smrg
534c1f859d4Smrg#ifdef FEATURE_OES_draw_texture
535c1f859d4Smrg   case GL_TEXTURE_CROP_RECT_OES:
536c1f859d4Smrg      {
537c1f859d4Smrg         /* convert float params to int */
538c1f859d4Smrg         GLint iparams[4];
539c1f859d4Smrg         iparams[0] = (GLint) params[0];
540c1f859d4Smrg         iparams[1] = (GLint) params[1];
541c1f859d4Smrg         iparams[2] = (GLint) params[2];
542c1f859d4Smrg         iparams[3] = (GLint) params[3];
543c1f859d4Smrg         need_update = set_tex_parameteri(ctx, target, iparams);
544c1f859d4Smrg      }
545c1f859d4Smrg      break;
546c1f859d4Smrg#endif
547c1f859d4Smrg
548c1f859d4Smrg   default:
549c1f859d4Smrg      /* this will generate an error if pname is illegal */
550c1f859d4Smrg      need_update = set_tex_parameterf(ctx, texObj, pname, params);
551c1f859d4Smrg   }
552c1f859d4Smrg
553c1f859d4Smrg   if (ctx->Driver.TexParameter && need_update) {
554c1f859d4Smrg      ctx->Driver.TexParameter(ctx, target, texObj, pname, params);
555c1f859d4Smrg   }
556c1f859d4Smrg}
557c1f859d4Smrg
558c1f859d4Smrg
559c1f859d4Smrgvoid GLAPIENTRY
560c1f859d4Smrg_mesa_TexParameteri(GLenum target, GLenum pname, GLint param)
561c1f859d4Smrg{
562c1f859d4Smrg   GLboolean need_update;
563c1f859d4Smrg   struct gl_texture_object *texObj;
564c1f859d4Smrg   GET_CURRENT_CONTEXT(ctx);
565c1f859d4Smrg   ASSERT_OUTSIDE_BEGIN_END(ctx);
566c1f859d4Smrg
567c1f859d4Smrg   texObj = get_texobj(ctx, target);
568c1f859d4Smrg   if (!texObj)
569c1f859d4Smrg      return;
570c1f859d4Smrg
571c1f859d4Smrg   switch (pname) {
572c1f859d4Smrg   case GL_TEXTURE_MIN_LOD:
573c1f859d4Smrg   case GL_TEXTURE_MAX_LOD:
574c1f859d4Smrg   case GL_TEXTURE_PRIORITY:
575c1f859d4Smrg   case GL_TEXTURE_MAX_ANISOTROPY_EXT:
576c1f859d4Smrg   case GL_TEXTURE_LOD_BIAS:
577c1f859d4Smrg   case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
578c1f859d4Smrg      {
579c1f859d4Smrg         GLfloat fparam = (GLfloat) param;
580c1f859d4Smrg         /* convert int param to float */
581c1f859d4Smrg         need_update = set_tex_parameterf(ctx, texObj, pname, &fparam);
582c1f859d4Smrg      }
583c1f859d4Smrg      break;
584c1f859d4Smrg   default:
585c1f859d4Smrg      /* this will generate an error if pname is illegal */
586c1f859d4Smrg      need_update = set_tex_parameteri(ctx, texObj, pname, &param);
587c1f859d4Smrg   }
588c1f859d4Smrg
589c1f859d4Smrg   if (ctx->Driver.TexParameter && need_update) {
590c1f859d4Smrg      GLfloat fparam = (GLfloat) param;
591c1f859d4Smrg      ctx->Driver.TexParameter(ctx, target, texObj, pname, &fparam);
592c1f859d4Smrg   }
593c1f859d4Smrg}
594c1f859d4Smrg
595c1f859d4Smrg
596c1f859d4Smrgvoid GLAPIENTRY
597c1f859d4Smrg_mesa_TexParameteriv(GLenum target, GLenum pname, const GLint *params)
598c1f859d4Smrg{
599c1f859d4Smrg   GLboolean need_update;
600c1f859d4Smrg   struct gl_texture_object *texObj;
601c1f859d4Smrg   GET_CURRENT_CONTEXT(ctx);
602c1f859d4Smrg   ASSERT_OUTSIDE_BEGIN_END(ctx);
603c1f859d4Smrg
604c1f859d4Smrg   texObj = get_texobj(ctx, target);
605c1f859d4Smrg   if (!texObj)
606c1f859d4Smrg      return;
607c1f859d4Smrg
608c1f859d4Smrg   switch (pname) {
609c1f859d4Smrg   case GL_TEXTURE_BORDER_COLOR:
610c1f859d4Smrg      {
611c1f859d4Smrg         /* convert int params to float */
612c1f859d4Smrg         GLfloat fparams[4];
613c1f859d4Smrg         fparams[0] = INT_TO_FLOAT(params[0]);
614c1f859d4Smrg         fparams[1] = INT_TO_FLOAT(params[1]);
615c1f859d4Smrg         fparams[2] = INT_TO_FLOAT(params[2]);
616c1f859d4Smrg         fparams[3] = INT_TO_FLOAT(params[3]);
617c1f859d4Smrg         need_update = set_tex_parameterf(ctx, texObj, pname, fparams);
618c1f859d4Smrg      }
619c1f859d4Smrg      break;
620c1f859d4Smrg   case GL_TEXTURE_MIN_LOD:
621c1f859d4Smrg   case GL_TEXTURE_MAX_LOD:
622c1f859d4Smrg   case GL_TEXTURE_PRIORITY:
623c1f859d4Smrg   case GL_TEXTURE_MAX_ANISOTROPY_EXT:
624c1f859d4Smrg   case GL_TEXTURE_LOD_BIAS:
625c1f859d4Smrg   case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
626c1f859d4Smrg      {
627c1f859d4Smrg         /* convert int param to float */
628c1f859d4Smrg         GLfloat fparam = (GLfloat) params[0];
629c1f859d4Smrg         need_update = set_tex_parameterf(ctx, texObj, pname, &fparam);
630c1f859d4Smrg      }
631c1f859d4Smrg      break;
632c1f859d4Smrg   default:
633c1f859d4Smrg      /* this will generate an error if pname is illegal */
634c1f859d4Smrg      need_update = set_tex_parameteri(ctx, texObj, pname, params);
635c1f859d4Smrg   }
636c1f859d4Smrg
637c1f859d4Smrg   if (ctx->Driver.TexParameter && need_update) {
638c1f859d4Smrg      GLfloat fparams[4];
639c1f859d4Smrg      fparams[0] = INT_TO_FLOAT(params[0]);
640c1f859d4Smrg      if (pname == GL_TEXTURE_BORDER_COLOR ||
641c1f859d4Smrg          pname == GL_TEXTURE_CROP_RECT_OES) {
642c1f859d4Smrg         fparams[1] = INT_TO_FLOAT(params[1]);
643c1f859d4Smrg         fparams[2] = INT_TO_FLOAT(params[2]);
644c1f859d4Smrg         fparams[3] = INT_TO_FLOAT(params[3]);
645c1f859d4Smrg      }
646c1f859d4Smrg      ctx->Driver.TexParameter(ctx, target, texObj, pname, fparams);
647c1f859d4Smrg   }
648c1f859d4Smrg}
649c1f859d4Smrg
650c1f859d4Smrg
651c1f859d4Smrgvoid GLAPIENTRY
652c1f859d4Smrg_mesa_GetTexLevelParameterfv( GLenum target, GLint level,
653c1f859d4Smrg                              GLenum pname, GLfloat *params )
654c1f859d4Smrg{
655c1f859d4Smrg   GLint iparam;
656c1f859d4Smrg   _mesa_GetTexLevelParameteriv( target, level, pname, &iparam );
657c1f859d4Smrg   *params = (GLfloat) iparam;
658c1f859d4Smrg}
659c1f859d4Smrg
660c1f859d4Smrg
661c1f859d4Smrgstatic GLuint
662c1f859d4Smrgtex_image_dimensions(GLcontext *ctx, GLenum target)
663c1f859d4Smrg{
664c1f859d4Smrg   switch (target) {
665c1f859d4Smrg      case GL_TEXTURE_1D:
666c1f859d4Smrg      case GL_PROXY_TEXTURE_1D:
667c1f859d4Smrg         return 1;
668c1f859d4Smrg      case GL_TEXTURE_2D:
669c1f859d4Smrg      case GL_PROXY_TEXTURE_2D:
670c1f859d4Smrg         return 2;
671c1f859d4Smrg      case GL_TEXTURE_3D:
672c1f859d4Smrg      case GL_PROXY_TEXTURE_3D:
673c1f859d4Smrg         return 3;
674c1f859d4Smrg      case GL_TEXTURE_CUBE_MAP:
675c1f859d4Smrg      case GL_PROXY_TEXTURE_CUBE_MAP:
676c1f859d4Smrg      case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
677c1f859d4Smrg      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
678c1f859d4Smrg      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
679c1f859d4Smrg      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
680c1f859d4Smrg      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
681c1f859d4Smrg      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
682c1f859d4Smrg         return ctx->Extensions.ARB_texture_cube_map ? 2 : 0;
683c1f859d4Smrg      case GL_TEXTURE_RECTANGLE_NV:
684c1f859d4Smrg      case GL_PROXY_TEXTURE_RECTANGLE_NV:
685c1f859d4Smrg         return ctx->Extensions.NV_texture_rectangle ? 2 : 0;
686c1f859d4Smrg      case GL_TEXTURE_1D_ARRAY_EXT:
687c1f859d4Smrg      case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
688c1f859d4Smrg         return ctx->Extensions.MESA_texture_array ? 2 : 0;
689c1f859d4Smrg      case GL_TEXTURE_2D_ARRAY_EXT:
690c1f859d4Smrg      case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
691c1f859d4Smrg         return ctx->Extensions.MESA_texture_array ? 3 : 0;
692c1f859d4Smrg      default:
693c1f859d4Smrg         _mesa_problem(ctx, "bad target in _mesa_tex_target_dimensions()");
694c1f859d4Smrg         return 0;
695c1f859d4Smrg   }
696c1f859d4Smrg}
697c1f859d4Smrg
698c1f859d4Smrg
699c1f859d4Smrgvoid GLAPIENTRY
700c1f859d4Smrg_mesa_GetTexLevelParameteriv( GLenum target, GLint level,
701c1f859d4Smrg                              GLenum pname, GLint *params )
702c1f859d4Smrg{
703c1f859d4Smrg   const struct gl_texture_unit *texUnit;
704c1f859d4Smrg   struct gl_texture_object *texObj;
705c1f859d4Smrg   const struct gl_texture_image *img = NULL;
706c1f859d4Smrg   GLuint dimensions;
707c1f859d4Smrg   GLboolean isProxy;
708c1f859d4Smrg   GLint maxLevels;
709c1f859d4Smrg   GET_CURRENT_CONTEXT(ctx);
710c1f859d4Smrg   ASSERT_OUTSIDE_BEGIN_END(ctx);
711c1f859d4Smrg
712c1f859d4Smrg   if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
713c1f859d4Smrg      _mesa_error(ctx, GL_INVALID_OPERATION,
714c1f859d4Smrg                  "glGetTexLevelParameteriv(current unit)");
715c1f859d4Smrg      return;
716c1f859d4Smrg   }
717c1f859d4Smrg
718c1f859d4Smrg   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
719c1f859d4Smrg
720c1f859d4Smrg   /* this will catch bad target values */
721c1f859d4Smrg   dimensions = tex_image_dimensions(ctx, target);  /* 1, 2 or 3 */
722c1f859d4Smrg   if (dimensions == 0) {
723c1f859d4Smrg      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)");
724c1f859d4Smrg      return;
725c1f859d4Smrg   }
726c1f859d4Smrg
727c1f859d4Smrg   maxLevels = _mesa_max_texture_levels(ctx, target);
728c1f859d4Smrg   if (maxLevels == 0) {
729c1f859d4Smrg      /* should not happen since <target> was just checked above */
730c1f859d4Smrg      _mesa_problem(ctx, "maxLevels=0 in _mesa_GetTexLevelParameter");
731c1f859d4Smrg      return;
732c1f859d4Smrg   }
733c1f859d4Smrg
734c1f859d4Smrg   if (level < 0 || level >= maxLevels) {
735c1f859d4Smrg      _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" );
736c1f859d4Smrg      return;
737c1f859d4Smrg   }
738c1f859d4Smrg
739c1f859d4Smrg   texObj = _mesa_select_tex_object(ctx, texUnit, target);
740c1f859d4Smrg   _mesa_lock_texture(ctx, texObj);
741c1f859d4Smrg
742c1f859d4Smrg   img = _mesa_select_tex_image(ctx, texObj, target, level);
743c1f859d4Smrg   if (!img || !img->TexFormat) {
744c1f859d4Smrg      /* undefined texture image */
745c1f859d4Smrg      if (pname == GL_TEXTURE_COMPONENTS)
746c1f859d4Smrg         *params = 1;
747c1f859d4Smrg      else
748c1f859d4Smrg         *params = 0;
749c1f859d4Smrg      goto out;
750c1f859d4Smrg   }
751c1f859d4Smrg
752c1f859d4Smrg   isProxy = _mesa_is_proxy_texture(target);
753c1f859d4Smrg
754c1f859d4Smrg   switch (pname) {
755c1f859d4Smrg      case GL_TEXTURE_WIDTH:
756c1f859d4Smrg         *params = img->Width;
757c1f859d4Smrg         break;
758c1f859d4Smrg      case GL_TEXTURE_HEIGHT:
759c1f859d4Smrg         *params = img->Height;
760c1f859d4Smrg         break;
761c1f859d4Smrg      case GL_TEXTURE_DEPTH:
762c1f859d4Smrg         *params = img->Depth;
763c1f859d4Smrg         break;
764c1f859d4Smrg      case GL_TEXTURE_INTERNAL_FORMAT:
765c1f859d4Smrg         *params = img->InternalFormat;
766c1f859d4Smrg         break;
767c1f859d4Smrg      case GL_TEXTURE_BORDER:
768c1f859d4Smrg         *params = img->Border;
769c1f859d4Smrg         break;
770c1f859d4Smrg      case GL_TEXTURE_RED_SIZE:
771c1f859d4Smrg         if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA)
772c1f859d4Smrg            *params = img->TexFormat->RedBits;
773c1f859d4Smrg         else
774c1f859d4Smrg            *params = 0;
775c1f859d4Smrg         break;
776c1f859d4Smrg      case GL_TEXTURE_GREEN_SIZE:
777c1f859d4Smrg         if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA)
778c1f859d4Smrg            *params = img->TexFormat->GreenBits;
779c1f859d4Smrg         else
780c1f859d4Smrg            *params = 0;
781c1f859d4Smrg         break;
782c1f859d4Smrg      case GL_TEXTURE_BLUE_SIZE:
783c1f859d4Smrg         if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA)
784c1f859d4Smrg            *params = img->TexFormat->BlueBits;
785c1f859d4Smrg         else
786c1f859d4Smrg            *params = 0;
787c1f859d4Smrg         break;
788c1f859d4Smrg      case GL_TEXTURE_ALPHA_SIZE:
789c1f859d4Smrg         if (img->_BaseFormat == GL_ALPHA ||
790c1f859d4Smrg             img->_BaseFormat == GL_LUMINANCE_ALPHA ||
791c1f859d4Smrg             img->_BaseFormat == GL_RGBA)
792c1f859d4Smrg            *params = img->TexFormat->AlphaBits;
793c1f859d4Smrg         else
794c1f859d4Smrg            *params = 0;
795c1f859d4Smrg         break;
796c1f859d4Smrg      case GL_TEXTURE_INTENSITY_SIZE:
797c1f859d4Smrg         if (img->_BaseFormat != GL_INTENSITY)
798c1f859d4Smrg            *params = 0;
799c1f859d4Smrg         else if (img->TexFormat->IntensityBits > 0)
800c1f859d4Smrg            *params = img->TexFormat->IntensityBits;
801c1f859d4Smrg         else /* intensity probably stored as rgb texture */
802c1f859d4Smrg            *params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits);
803c1f859d4Smrg         break;
804c1f859d4Smrg      case GL_TEXTURE_LUMINANCE_SIZE:
805c1f859d4Smrg         if (img->_BaseFormat != GL_LUMINANCE &&
806c1f859d4Smrg             img->_BaseFormat != GL_LUMINANCE_ALPHA)
807c1f859d4Smrg            *params = 0;
808c1f859d4Smrg         else if (img->TexFormat->LuminanceBits > 0)
809c1f859d4Smrg            *params = img->TexFormat->LuminanceBits;
810c1f859d4Smrg         else /* luminance probably stored as rgb texture */
811c1f859d4Smrg            *params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits);
812c1f859d4Smrg         break;
813c1f859d4Smrg      case GL_TEXTURE_INDEX_SIZE_EXT:
814c1f859d4Smrg         if (img->_BaseFormat == GL_COLOR_INDEX)
815c1f859d4Smrg            *params = img->TexFormat->IndexBits;
816c1f859d4Smrg         else
817c1f859d4Smrg            *params = 0;
818c1f859d4Smrg         break;
819c1f859d4Smrg      case GL_TEXTURE_DEPTH_SIZE_ARB:
820c1f859d4Smrg         if (ctx->Extensions.ARB_depth_texture)
821c1f859d4Smrg            *params = img->TexFormat->DepthBits;
822c1f859d4Smrg         else
823c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
824c1f859d4Smrg                        "glGetTexLevelParameter[if]v(pname)");
825c1f859d4Smrg         break;
826c1f859d4Smrg      case GL_TEXTURE_STENCIL_SIZE_EXT:
827c1f859d4Smrg         if (ctx->Extensions.EXT_packed_depth_stencil) {
828c1f859d4Smrg            *params = img->TexFormat->StencilBits;
829c1f859d4Smrg         }
830c1f859d4Smrg         else {
831c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
832c1f859d4Smrg                        "glGetTexLevelParameter[if]v(pname)");
833c1f859d4Smrg         }
834c1f859d4Smrg         break;
835c1f859d4Smrg
836c1f859d4Smrg      /* GL_ARB_texture_compression */
837c1f859d4Smrg      case GL_TEXTURE_COMPRESSED_IMAGE_SIZE:
838c1f859d4Smrg         if (ctx->Extensions.ARB_texture_compression) {
839c1f859d4Smrg            if (img->IsCompressed && !isProxy) {
840c1f859d4Smrg               /* Don't use ctx->Driver.CompressedTextureSize() since that
841c1f859d4Smrg                * may returned a padded hardware size.
842c1f859d4Smrg                */
843c1f859d4Smrg               *params = _mesa_compressed_texture_size(ctx, img->Width,
844c1f859d4Smrg                                                   img->Height, img->Depth,
845c1f859d4Smrg                                                   img->TexFormat->MesaFormat);
846c1f859d4Smrg            }
847c1f859d4Smrg            else {
848c1f859d4Smrg               _mesa_error(ctx, GL_INVALID_OPERATION,
849c1f859d4Smrg                           "glGetTexLevelParameter[if]v(pname)");
850c1f859d4Smrg            }
851c1f859d4Smrg         }
852c1f859d4Smrg         else {
853c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
854c1f859d4Smrg                        "glGetTexLevelParameter[if]v(pname)");
855c1f859d4Smrg         }
856c1f859d4Smrg         break;
857c1f859d4Smrg      case GL_TEXTURE_COMPRESSED:
858c1f859d4Smrg         if (ctx->Extensions.ARB_texture_compression) {
859c1f859d4Smrg            *params = (GLint) img->IsCompressed;
860c1f859d4Smrg         }
861c1f859d4Smrg         else {
862c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
863c1f859d4Smrg                        "glGetTexLevelParameter[if]v(pname)");
864c1f859d4Smrg         }
865c1f859d4Smrg         break;
866c1f859d4Smrg
867c1f859d4Smrg      /* GL_ARB_texture_float */
868c1f859d4Smrg      case GL_TEXTURE_RED_TYPE_ARB:
869c1f859d4Smrg         if (ctx->Extensions.ARB_texture_float) {
870c1f859d4Smrg            *params = img->TexFormat->RedBits ? img->TexFormat->DataType : GL_NONE;
871c1f859d4Smrg         }
872c1f859d4Smrg         else {
873c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
874c1f859d4Smrg                        "glGetTexLevelParameter[if]v(pname)");
875c1f859d4Smrg         }
876c1f859d4Smrg         break;
877c1f859d4Smrg      case GL_TEXTURE_GREEN_TYPE_ARB:
878c1f859d4Smrg         if (ctx->Extensions.ARB_texture_float) {
879c1f859d4Smrg            *params = img->TexFormat->GreenBits ? img->TexFormat->DataType : GL_NONE;
880c1f859d4Smrg         }
881c1f859d4Smrg         else {
882c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
883c1f859d4Smrg                        "glGetTexLevelParameter[if]v(pname)");
884c1f859d4Smrg         }
885c1f859d4Smrg         break;
886c1f859d4Smrg      case GL_TEXTURE_BLUE_TYPE_ARB:
887c1f859d4Smrg         if (ctx->Extensions.ARB_texture_float) {
888c1f859d4Smrg            *params = img->TexFormat->BlueBits ? img->TexFormat->DataType : GL_NONE;
889c1f859d4Smrg         }
890c1f859d4Smrg         else {
891c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
892c1f859d4Smrg                        "glGetTexLevelParameter[if]v(pname)");
893c1f859d4Smrg         }
894c1f859d4Smrg         break;
895c1f859d4Smrg      case GL_TEXTURE_ALPHA_TYPE_ARB:
896c1f859d4Smrg         if (ctx->Extensions.ARB_texture_float) {
897c1f859d4Smrg            *params = img->TexFormat->AlphaBits ? img->TexFormat->DataType : GL_NONE;
898c1f859d4Smrg         }
899c1f859d4Smrg         else {
900c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
901c1f859d4Smrg                        "glGetTexLevelParameter[if]v(pname)");
902c1f859d4Smrg         }
903c1f859d4Smrg         break;
904c1f859d4Smrg      case GL_TEXTURE_LUMINANCE_TYPE_ARB:
905c1f859d4Smrg         if (ctx->Extensions.ARB_texture_float) {
906c1f859d4Smrg            *params = img->TexFormat->LuminanceBits ? img->TexFormat->DataType : GL_NONE;
907c1f859d4Smrg         }
908c1f859d4Smrg         else {
909c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
910c1f859d4Smrg                        "glGetTexLevelParameter[if]v(pname)");
911c1f859d4Smrg         }
912c1f859d4Smrg         break;
913c1f859d4Smrg      case GL_TEXTURE_INTENSITY_TYPE_ARB:
914c1f859d4Smrg         if (ctx->Extensions.ARB_texture_float) {
915c1f859d4Smrg            *params = img->TexFormat->IntensityBits ? img->TexFormat->DataType : GL_NONE;
916c1f859d4Smrg         }
917c1f859d4Smrg         else {
918c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
919c1f859d4Smrg                        "glGetTexLevelParameter[if]v(pname)");
920c1f859d4Smrg         }
921c1f859d4Smrg         break;
922c1f859d4Smrg      case GL_TEXTURE_DEPTH_TYPE_ARB:
923c1f859d4Smrg         if (ctx->Extensions.ARB_texture_float) {
924c1f859d4Smrg            *params = img->TexFormat->DepthBits ? img->TexFormat->DataType : GL_NONE;
925c1f859d4Smrg         }
926c1f859d4Smrg         else {
927c1f859d4Smrg            _mesa_error(ctx, GL_INVALID_ENUM,
928c1f859d4Smrg                        "glGetTexLevelParameter[if]v(pname)");
929c1f859d4Smrg         }
930c1f859d4Smrg         break;
931c1f859d4Smrg
932c1f859d4Smrg      default:
933c1f859d4Smrg         _mesa_error(ctx, GL_INVALID_ENUM,
934c1f859d4Smrg                     "glGetTexLevelParameter[if]v(pname)");
935c1f859d4Smrg   }
936c1f859d4Smrg
937c1f859d4Smrg out:
938c1f859d4Smrg   _mesa_unlock_texture(ctx, texObj);
939c1f859d4Smrg}
940c1f859d4Smrg
941c1f859d4Smrg
942c1f859d4Smrg
943c1f859d4Smrgvoid GLAPIENTRY
944c1f859d4Smrg_mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
945c1f859d4Smrg{
946c1f859d4Smrg   struct gl_texture_unit *texUnit;
947c1f859d4Smrg   struct gl_texture_object *obj;
948c1f859d4Smrg   GLboolean error = GL_FALSE;
949c1f859d4Smrg   GET_CURRENT_CONTEXT(ctx);
950c1f859d4Smrg   ASSERT_OUTSIDE_BEGIN_END(ctx);
951c1f859d4Smrg
952c1f859d4Smrg   if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
953c1f859d4Smrg      _mesa_error(ctx, GL_INVALID_OPERATION,
954c1f859d4Smrg                  "glGetTexParameterfv(current unit)");
955c1f859d4Smrg      return;
956c1f859d4Smrg   }
957c1f859d4Smrg
958c1f859d4Smrg   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
959c1f859d4Smrg
960c1f859d4Smrg   obj = _mesa_select_tex_object(ctx, texUnit, target);
961c1f859d4Smrg   if (!obj) {
962c1f859d4Smrg      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(target)");
963c1f859d4Smrg      return;
964c1f859d4Smrg   }
965c1f859d4Smrg
966c1f859d4Smrg   _mesa_lock_texture(ctx, obj);
967c1f859d4Smrg   switch (pname) {
968c1f859d4Smrg      case GL_TEXTURE_MAG_FILTER:
969c1f859d4Smrg	 *params = ENUM_TO_FLOAT(obj->MagFilter);
970c1f859d4Smrg	 break;
971c1f859d4Smrg      case GL_TEXTURE_MIN_FILTER:
972c1f859d4Smrg         *params = ENUM_TO_FLOAT(obj->MinFilter);
973c1f859d4Smrg         break;
974c1f859d4Smrg      case GL_TEXTURE_WRAP_S:
975c1f859d4Smrg         *params = ENUM_TO_FLOAT(obj->WrapS);
976c1f859d4Smrg         break;
977c1f859d4Smrg      case GL_TEXTURE_WRAP_T:
978c1f859d4Smrg         *params = ENUM_TO_FLOAT(obj->WrapT);
979c1f859d4Smrg         break;
980c1f859d4Smrg      case GL_TEXTURE_WRAP_R:
981c1f859d4Smrg         *params = ENUM_TO_FLOAT(obj->WrapR);
982c1f859d4Smrg         break;
983c1f859d4Smrg      case GL_TEXTURE_BORDER_COLOR:
984c1f859d4Smrg         params[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F);
985c1f859d4Smrg         params[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F);
986c1f859d4Smrg         params[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F);
987c1f859d4Smrg         params[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F);
988c1f859d4Smrg         break;
989c1f859d4Smrg      case GL_TEXTURE_RESIDENT:
990c1f859d4Smrg         {
991c1f859d4Smrg            GLboolean resident;
992c1f859d4Smrg            if (ctx->Driver.IsTextureResident)
993c1f859d4Smrg               resident = ctx->Driver.IsTextureResident(ctx, obj);
994c1f859d4Smrg            else
995c1f859d4Smrg               resident = GL_TRUE;
996c1f859d4Smrg            *params = ENUM_TO_FLOAT(resident);
997c1f859d4Smrg         }
998c1f859d4Smrg         break;
999c1f859d4Smrg      case GL_TEXTURE_PRIORITY:
1000c1f859d4Smrg         *params = obj->Priority;
1001c1f859d4Smrg         break;
1002c1f859d4Smrg      case GL_TEXTURE_MIN_LOD:
1003c1f859d4Smrg         *params = obj->MinLod;
1004c1f859d4Smrg         break;
1005c1f859d4Smrg      case GL_TEXTURE_MAX_LOD:
1006c1f859d4Smrg         *params = obj->MaxLod;
1007c1f859d4Smrg         break;
1008c1f859d4Smrg      case GL_TEXTURE_BASE_LEVEL:
1009c1f859d4Smrg         *params = (GLfloat) obj->BaseLevel;
1010c1f859d4Smrg         break;
1011c1f859d4Smrg      case GL_TEXTURE_MAX_LEVEL:
1012c1f859d4Smrg         *params = (GLfloat) obj->MaxLevel;
1013c1f859d4Smrg         break;
1014c1f859d4Smrg      case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1015c1f859d4Smrg         if (ctx->Extensions.EXT_texture_filter_anisotropic) {
1016c1f859d4Smrg            *params = obj->MaxAnisotropy;
1017c1f859d4Smrg         }
1018c1f859d4Smrg	 else
1019c1f859d4Smrg	    error = 1;
1020c1f859d4Smrg         break;
1021c1f859d4Smrg      case GL_TEXTURE_COMPARE_SGIX:
1022c1f859d4Smrg         if (ctx->Extensions.SGIX_shadow) {
1023c1f859d4Smrg            *params = (GLfloat) obj->CompareFlag;
1024c1f859d4Smrg         }
1025c1f859d4Smrg	 else
1026c1f859d4Smrg	    error = 1;
1027c1f859d4Smrg         break;
1028c1f859d4Smrg      case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
1029c1f859d4Smrg         if (ctx->Extensions.SGIX_shadow) {
1030c1f859d4Smrg            *params = (GLfloat) obj->CompareOperator;
1031c1f859d4Smrg         }
1032c1f859d4Smrg	 else
1033c1f859d4Smrg	    error = 1;
1034c1f859d4Smrg         break;
1035c1f859d4Smrg      case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
1036c1f859d4Smrg         if (ctx->Extensions.SGIX_shadow_ambient) {
1037c1f859d4Smrg            *params = obj->ShadowAmbient;
1038c1f859d4Smrg         }
1039c1f859d4Smrg	 else
1040c1f859d4Smrg	    error = 1;
1041c1f859d4Smrg         break;
1042c1f859d4Smrg      case GL_GENERATE_MIPMAP_SGIS:
1043c1f859d4Smrg         if (ctx->Extensions.SGIS_generate_mipmap) {
1044c1f859d4Smrg            *params = (GLfloat) obj->GenerateMipmap;
1045c1f859d4Smrg         }
1046c1f859d4Smrg	 else
1047c1f859d4Smrg	    error = 1;
1048c1f859d4Smrg         break;
1049c1f859d4Smrg      case GL_TEXTURE_COMPARE_MODE_ARB:
1050c1f859d4Smrg         if (ctx->Extensions.ARB_shadow) {
1051c1f859d4Smrg            *params = (GLfloat) obj->CompareMode;
1052c1f859d4Smrg         }
1053c1f859d4Smrg	 else
1054c1f859d4Smrg	    error = 1;
1055c1f859d4Smrg         break;
1056c1f859d4Smrg      case GL_TEXTURE_COMPARE_FUNC_ARB:
1057c1f859d4Smrg         if (ctx->Extensions.ARB_shadow) {
1058c1f859d4Smrg            *params = (GLfloat) obj->CompareFunc;
1059c1f859d4Smrg         }
1060c1f859d4Smrg	 else
1061c1f859d4Smrg	    error = 1;
1062c1f859d4Smrg         break;
1063c1f859d4Smrg      case GL_DEPTH_TEXTURE_MODE_ARB:
1064c1f859d4Smrg         if (ctx->Extensions.ARB_depth_texture) {
1065c1f859d4Smrg            *params = (GLfloat) obj->DepthMode;
1066c1f859d4Smrg         }
1067c1f859d4Smrg	 else
1068c1f859d4Smrg	    error = 1;
1069c1f859d4Smrg         break;
1070c1f859d4Smrg      case GL_TEXTURE_LOD_BIAS:
1071c1f859d4Smrg         if (ctx->Extensions.EXT_texture_lod_bias) {
1072c1f859d4Smrg            *params = obj->LodBias;
1073c1f859d4Smrg         }
1074c1f859d4Smrg	 else
1075c1f859d4Smrg	    error = 1;
1076c1f859d4Smrg         break;
1077c1f859d4Smrg#ifdef FEATURE_OES_draw_texture
1078c1f859d4Smrg      case GL_TEXTURE_CROP_RECT_OES:
1079c1f859d4Smrg         params[0] = obj->CropRect[0];
1080c1f859d4Smrg         params[1] = obj->CropRect[1];
1081c1f859d4Smrg         params[2] = obj->CropRect[2];
1082c1f859d4Smrg         params[3] = obj->CropRect[3];
1083c1f859d4Smrg         break;
1084c1f859d4Smrg#endif
1085c1f859d4Smrg      default:
1086c1f859d4Smrg	 error = 1;
1087c1f859d4Smrg	 break;
1088c1f859d4Smrg   }
1089c1f859d4Smrg   if (error)
1090c1f859d4Smrg      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname=0x%x)",
1091c1f859d4Smrg		  pname);
1092c1f859d4Smrg
1093c1f859d4Smrg   _mesa_unlock_texture(ctx, obj);
1094c1f859d4Smrg}
1095c1f859d4Smrg
1096c1f859d4Smrg
1097c1f859d4Smrgvoid GLAPIENTRY
1098c1f859d4Smrg_mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params )
1099c1f859d4Smrg{
1100c1f859d4Smrg   struct gl_texture_unit *texUnit;
1101c1f859d4Smrg   struct gl_texture_object *obj;
1102c1f859d4Smrg   GET_CURRENT_CONTEXT(ctx);
1103c1f859d4Smrg   ASSERT_OUTSIDE_BEGIN_END(ctx);
1104c1f859d4Smrg
1105c1f859d4Smrg   if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
1106c1f859d4Smrg      _mesa_error(ctx, GL_INVALID_OPERATION,
1107c1f859d4Smrg                  "glGetTexParameteriv(current unit)");
1108c1f859d4Smrg      return;
1109c1f859d4Smrg   }
1110c1f859d4Smrg
1111c1f859d4Smrg   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
1112c1f859d4Smrg
1113c1f859d4Smrg   obj = _mesa_select_tex_object(ctx, texUnit, target);
1114c1f859d4Smrg   if (!obj) {
1115c1f859d4Smrg      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(target)");
1116c1f859d4Smrg      return;
1117c1f859d4Smrg   }
1118c1f859d4Smrg
1119c1f859d4Smrg   switch (pname) {
1120c1f859d4Smrg      case GL_TEXTURE_MAG_FILTER:
1121c1f859d4Smrg         *params = (GLint) obj->MagFilter;
1122c1f859d4Smrg         return;
1123c1f859d4Smrg      case GL_TEXTURE_MIN_FILTER:
1124c1f859d4Smrg         *params = (GLint) obj->MinFilter;
1125c1f859d4Smrg         return;
1126c1f859d4Smrg      case GL_TEXTURE_WRAP_S:
1127c1f859d4Smrg         *params = (GLint) obj->WrapS;
1128c1f859d4Smrg         return;
1129c1f859d4Smrg      case GL_TEXTURE_WRAP_T:
1130c1f859d4Smrg         *params = (GLint) obj->WrapT;
1131c1f859d4Smrg         return;
1132c1f859d4Smrg      case GL_TEXTURE_WRAP_R:
1133c1f859d4Smrg         *params = (GLint) obj->WrapR;
1134c1f859d4Smrg         return;
1135c1f859d4Smrg      case GL_TEXTURE_BORDER_COLOR:
1136c1f859d4Smrg         {
1137c1f859d4Smrg            GLfloat b[4];
1138c1f859d4Smrg            b[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F);
1139c1f859d4Smrg            b[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F);
1140c1f859d4Smrg            b[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F);
1141c1f859d4Smrg            b[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F);
1142c1f859d4Smrg            params[0] = FLOAT_TO_INT(b[0]);
1143c1f859d4Smrg            params[1] = FLOAT_TO_INT(b[1]);
1144c1f859d4Smrg            params[2] = FLOAT_TO_INT(b[2]);
1145c1f859d4Smrg            params[3] = FLOAT_TO_INT(b[3]);
1146c1f859d4Smrg         }
1147c1f859d4Smrg         return;
1148c1f859d4Smrg      case GL_TEXTURE_RESIDENT:
1149c1f859d4Smrg         {
1150c1f859d4Smrg            GLboolean resident;
1151c1f859d4Smrg            if (ctx->Driver.IsTextureResident)
1152c1f859d4Smrg               resident = ctx->Driver.IsTextureResident(ctx, obj);
1153c1f859d4Smrg            else
1154c1f859d4Smrg               resident = GL_TRUE;
1155c1f859d4Smrg            *params = (GLint) resident;
1156c1f859d4Smrg         }
1157c1f859d4Smrg         return;
1158c1f859d4Smrg      case GL_TEXTURE_PRIORITY:
1159c1f859d4Smrg         *params = FLOAT_TO_INT(obj->Priority);
1160c1f859d4Smrg         return;
1161c1f859d4Smrg      case GL_TEXTURE_MIN_LOD:
1162c1f859d4Smrg         *params = (GLint) obj->MinLod;
1163c1f859d4Smrg         return;
1164c1f859d4Smrg      case GL_TEXTURE_MAX_LOD:
1165c1f859d4Smrg         *params = (GLint) obj->MaxLod;
1166c1f859d4Smrg         return;
1167c1f859d4Smrg      case GL_TEXTURE_BASE_LEVEL:
1168c1f859d4Smrg         *params = obj->BaseLevel;
1169c1f859d4Smrg         return;
1170c1f859d4Smrg      case GL_TEXTURE_MAX_LEVEL:
1171c1f859d4Smrg         *params = obj->MaxLevel;
1172c1f859d4Smrg         return;
1173c1f859d4Smrg      case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1174c1f859d4Smrg         if (ctx->Extensions.EXT_texture_filter_anisotropic) {
1175c1f859d4Smrg            *params = (GLint) obj->MaxAnisotropy;
1176c1f859d4Smrg            return;
1177c1f859d4Smrg         }
1178c1f859d4Smrg         break;
1179c1f859d4Smrg      case GL_TEXTURE_COMPARE_SGIX:
1180c1f859d4Smrg         if (ctx->Extensions.SGIX_shadow) {
1181c1f859d4Smrg            *params = (GLint) obj->CompareFlag;
1182c1f859d4Smrg            return;
1183c1f859d4Smrg         }
1184c1f859d4Smrg         break;
1185c1f859d4Smrg      case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
1186c1f859d4Smrg         if (ctx->Extensions.SGIX_shadow) {
1187c1f859d4Smrg            *params = (GLint) obj->CompareOperator;
1188c1f859d4Smrg            return;
1189c1f859d4Smrg         }
1190c1f859d4Smrg         break;
1191c1f859d4Smrg      case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
1192c1f859d4Smrg         if (ctx->Extensions.SGIX_shadow_ambient) {
1193c1f859d4Smrg            *params = (GLint) FLOAT_TO_INT(obj->ShadowAmbient);
1194c1f859d4Smrg            return;
1195c1f859d4Smrg         }
1196c1f859d4Smrg         break;
1197c1f859d4Smrg      case GL_GENERATE_MIPMAP_SGIS:
1198c1f859d4Smrg         if (ctx->Extensions.SGIS_generate_mipmap) {
1199c1f859d4Smrg            *params = (GLint) obj->GenerateMipmap;
1200c1f859d4Smrg            return;
1201c1f859d4Smrg         }
1202c1f859d4Smrg         break;
1203c1f859d4Smrg      case GL_TEXTURE_COMPARE_MODE_ARB:
1204c1f859d4Smrg         if (ctx->Extensions.ARB_shadow) {
1205c1f859d4Smrg            *params = (GLint) obj->CompareMode;
1206c1f859d4Smrg            return;
1207c1f859d4Smrg         }
1208c1f859d4Smrg         break;
1209c1f859d4Smrg      case GL_TEXTURE_COMPARE_FUNC_ARB:
1210c1f859d4Smrg         if (ctx->Extensions.ARB_shadow) {
1211c1f859d4Smrg            *params = (GLint) obj->CompareFunc;
1212c1f859d4Smrg            return;
1213c1f859d4Smrg         }
1214c1f859d4Smrg         break;
1215c1f859d4Smrg      case GL_DEPTH_TEXTURE_MODE_ARB:
1216c1f859d4Smrg         if (ctx->Extensions.ARB_depth_texture) {
1217c1f859d4Smrg            *params = (GLint) obj->DepthMode;
1218c1f859d4Smrg            return;
1219c1f859d4Smrg         }
1220c1f859d4Smrg         break;
1221c1f859d4Smrg      case GL_TEXTURE_LOD_BIAS:
1222c1f859d4Smrg         if (ctx->Extensions.EXT_texture_lod_bias) {
1223c1f859d4Smrg            *params = (GLint) obj->LodBias;
1224c1f859d4Smrg            return;
1225c1f859d4Smrg         }
1226c1f859d4Smrg         break;
1227c1f859d4Smrg#ifdef FEATURE_OES_draw_texture
1228c1f859d4Smrg      case GL_TEXTURE_CROP_RECT_OES:
1229c1f859d4Smrg         params[0] = obj->CropRect[0];
1230c1f859d4Smrg         params[1] = obj->CropRect[1];
1231c1f859d4Smrg         params[2] = obj->CropRect[2];
1232c1f859d4Smrg         params[3] = obj->CropRect[3];
1233c1f859d4Smrg         break;
1234c1f859d4Smrg#endif
1235c1f859d4Smrg      default:
1236c1f859d4Smrg         ; /* silence warnings */
1237c1f859d4Smrg   }
1238c1f859d4Smrg   /* If we get here, pname was an unrecognized enum */
1239c1f859d4Smrg   _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname=0x%x)", pname);
1240c1f859d4Smrg}
1241