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, ¶m); 493c1f859d4Smrg } 494c1f859d4Smrg 495c1f859d4Smrg if (ctx->Driver.TexParameter && need_update) { 496c1f859d4Smrg ctx->Driver.TexParameter(ctx, target, texObj, pname, ¶m); 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, ¶m); 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