ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

texparam.c
Go to the documentation of this file.
00001 /*
00002  * Mesa 3-D graphics library
00003  * Version:  7.5
00004  *
00005  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
00006  * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
00007  *
00008  * Permission is hereby granted, free of charge, to any person obtaining a
00009  * copy of this software and associated documentation files (the "Software"),
00010  * to deal in the Software without restriction, including without limitation
00011  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
00012  * and/or sell copies of the Software, and to permit persons to whom the
00013  * Software is furnished to do so, subject to the following conditions:
00014  *
00015  * The above copyright notice and this permission notice shall be included
00016  * in all copies or substantial portions of the Software.
00017  *
00018  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00019  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00020  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
00021  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
00022  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
00023  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00024  */
00025 
00033 #include "main/glheader.h"
00034 #include "main/context.h"
00035 #include "main/enums.h"
00036 #include "main/colormac.h"
00037 #include "main/macros.h"
00038 #include "main/texcompress.h"
00039 #include "main/texparam.h"
00040 #include "main/teximage.h"
00041 
00042 
00047 static GLboolean 
00048 validate_texture_wrap_mode(GLcontext * ctx, GLenum target, GLenum wrap)
00049 {
00050    const struct gl_extensions * const e = & ctx->Extensions;
00051 
00052    if (wrap == GL_CLAMP || wrap == GL_CLAMP_TO_EDGE ||
00053        (wrap == GL_CLAMP_TO_BORDER && e->ARB_texture_border_clamp)) {
00054       /* any texture target */
00055       return GL_TRUE;
00056    }
00057    else if (target != GL_TEXTURE_RECTANGLE_NV &&
00058         (wrap == GL_REPEAT ||
00059          (wrap == GL_MIRRORED_REPEAT &&
00060           e->ARB_texture_mirrored_repeat) ||
00061          (wrap == GL_MIRROR_CLAMP_EXT &&
00062           (e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp)) ||
00063          (wrap == GL_MIRROR_CLAMP_TO_EDGE_EXT &&
00064           (e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp)) ||
00065          (wrap == GL_MIRROR_CLAMP_TO_BORDER_EXT &&
00066           (e->EXT_texture_mirror_clamp)))) {
00067       /* non-rectangle texture */
00068       return GL_TRUE;
00069    }
00070 
00071    _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
00072    return GL_FALSE;
00073 }
00074 
00075 
00080 static struct gl_texture_object *
00081 get_texobj(GLcontext *ctx, GLenum target)
00082 {
00083    struct gl_texture_unit *texUnit;
00084 
00085    if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
00086       _mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameter(current unit)");
00087       return NULL;
00088    }
00089 
00090    texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
00091 
00092    switch (target) {
00093    case GL_TEXTURE_1D:
00094       return texUnit->CurrentTex[TEXTURE_1D_INDEX];
00095    case GL_TEXTURE_2D:
00096       return texUnit->CurrentTex[TEXTURE_2D_INDEX];
00097    case GL_TEXTURE_3D:
00098       return texUnit->CurrentTex[TEXTURE_3D_INDEX];
00099    case GL_TEXTURE_CUBE_MAP:
00100       if (ctx->Extensions.ARB_texture_cube_map) {
00101          return texUnit->CurrentTex[TEXTURE_CUBE_INDEX];
00102       }
00103       break;
00104    case GL_TEXTURE_RECTANGLE_NV:
00105       if (ctx->Extensions.NV_texture_rectangle) {
00106          return texUnit->CurrentTex[TEXTURE_RECT_INDEX];
00107       }
00108       break;
00109    case GL_TEXTURE_1D_ARRAY_EXT:
00110       if (ctx->Extensions.MESA_texture_array) {
00111          return texUnit->CurrentTex[TEXTURE_1D_ARRAY_INDEX];
00112       }
00113       break;
00114    case GL_TEXTURE_2D_ARRAY_EXT:
00115       if (ctx->Extensions.MESA_texture_array) {
00116          return texUnit->CurrentTex[TEXTURE_2D_ARRAY_INDEX];
00117       }
00118       break;
00119    default:
00120       ;
00121    }
00122 
00123    _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(target)");
00124    return NULL;
00125 }
00126 
00127 
00134 static INLINE void
00135 flush(GLcontext *ctx, struct gl_texture_object *texObj)
00136 {
00137    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
00138    texObj->_Complete = GL_FALSE;
00139 }
00140 
00141 
00143 static void
00144 set_tex_parameteri(GLcontext *ctx,
00145                    struct gl_texture_object *texObj,
00146                    GLenum pname, const GLint *params)
00147 {
00148    switch (pname) {
00149    case GL_TEXTURE_MIN_FILTER:
00150       if (texObj->MinFilter == params[0])
00151          return;
00152       switch (params[0]) {
00153       case GL_NEAREST:
00154       case GL_LINEAR:
00155          flush(ctx, texObj);
00156          texObj->MinFilter = params[0];
00157          return;
00158       case GL_NEAREST_MIPMAP_NEAREST:
00159       case GL_LINEAR_MIPMAP_NEAREST:
00160       case GL_NEAREST_MIPMAP_LINEAR:
00161       case GL_LINEAR_MIPMAP_LINEAR:
00162          if (texObj->Target != GL_TEXTURE_RECTANGLE_NV) {
00163             flush(ctx, texObj);
00164             texObj->MinFilter = params[0];
00165             return;
00166          }
00167          /* fall-through */
00168       default:
00169          _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
00170       }
00171       return;
00172 
00173    case GL_TEXTURE_MAG_FILTER:
00174       if (texObj->MagFilter == params[0])
00175          return;
00176       switch (params[0]) {
00177       case GL_NEAREST:
00178       case GL_LINEAR:
00179          flush(ctx, texObj);
00180          texObj->MagFilter = params[0];
00181          return;
00182       default:
00183          _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
00184       }
00185       return;
00186 
00187    case GL_TEXTURE_WRAP_S:
00188       if (texObj->WrapS == params[0])
00189          return;
00190       if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
00191          flush(ctx, texObj);
00192          texObj->WrapS = params[0];
00193       }
00194       return;
00195 
00196    case GL_TEXTURE_WRAP_T:
00197       if (texObj->WrapT == params[0])
00198          return;
00199       if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
00200          flush(ctx, texObj);
00201          texObj->WrapT = params[0];
00202       }
00203       return;
00204 
00205    case GL_TEXTURE_WRAP_R:
00206       if (texObj->WrapR == params[0])
00207          return;
00208       if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
00209          flush(ctx, texObj);
00210          texObj->WrapR = params[0];
00211       }
00212       return;
00213 
00214    case GL_TEXTURE_BASE_LEVEL:
00215       if (texObj->BaseLevel == params[0])
00216          return;
00217       if (params[0] < 0 ||
00218           (texObj->Target == GL_TEXTURE_RECTANGLE_ARB && params[0] != 0)) {
00219          _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)");
00220          return;
00221       }
00222       flush(ctx, texObj);
00223       texObj->BaseLevel = params[0];
00224       return;
00225 
00226    case GL_TEXTURE_MAX_LEVEL:
00227       if (texObj->MaxLevel == params[0])
00228          return;
00229       if (params[0] < 0 || texObj->Target == GL_TEXTURE_RECTANGLE_ARB) {
00230          _mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameter(param)");
00231          return;
00232       }
00233       flush(ctx, texObj);
00234       texObj->MaxLevel = params[0];
00235       return;
00236 
00237    case GL_TEXTURE_COMPARE_SGIX:
00238       if (ctx->Extensions.SGIX_shadow) {
00239          FLUSH_VERTICES(ctx, _NEW_TEXTURE);
00240          texObj->CompareFlag = params[0] ? GL_TRUE : GL_FALSE;
00241       }
00242       else {
00243          _mesa_error(ctx, GL_INVALID_ENUM,
00244                      "glTexParameter(pname=GL_TEXTURE_COMPARE_SGIX)");
00245       }
00246       return;
00247 
00248    case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
00249       if (ctx->Extensions.SGIX_shadow &&
00250           (params[0] == GL_TEXTURE_LEQUAL_R_SGIX || 
00251            params[0] == GL_TEXTURE_GEQUAL_R_SGIX)) {
00252          FLUSH_VERTICES(ctx, _NEW_TEXTURE);
00253          texObj->CompareOperator = params[0];
00254       }
00255       else {
00256          _mesa_error(ctx, GL_INVALID_ENUM,
00257                      "glTexParameter(GL_TEXTURE_COMPARE_OPERATOR_SGIX)");
00258       }
00259       return;
00260 
00261    case GL_GENERATE_MIPMAP_SGIS:
00262       if (ctx->Extensions.SGIS_generate_mipmap) {
00263          if (texObj->GenerateMipmap != params[0]) {
00264             flush(ctx, texObj);
00265             texObj->GenerateMipmap = params[0] ? GL_TRUE : GL_FALSE;
00266          }
00267       }
00268       else {
00269          _mesa_error(ctx, GL_INVALID_ENUM,
00270                      "glTexParameter(pname=GL_GENERATE_MIPMAP_SGIS)");
00271       }
00272       return;
00273 
00274    case GL_TEXTURE_COMPARE_MODE_ARB:
00275       if (ctx->Extensions.ARB_shadow &&
00276           (params[0] == GL_NONE ||
00277            params[0] == GL_COMPARE_R_TO_TEXTURE_ARB)) {
00278          if (texObj->CompareMode != params[0]) {
00279             flush(ctx, texObj);
00280             texObj->CompareMode = params[0];
00281          }
00282       }
00283       else {
00284          _mesa_error(ctx, GL_INVALID_ENUM,
00285                      "glTexParameter(GL_TEXTURE_COMPARE_MODE_ARB)");
00286       }
00287       return;
00288 
00289    case GL_TEXTURE_COMPARE_FUNC_ARB:
00290       if (ctx->Extensions.ARB_shadow) {
00291          if (texObj->CompareFunc == params[0])
00292             return;
00293          switch (params[0]) {
00294          case GL_LEQUAL:
00295          case GL_GEQUAL:
00296             flush(ctx, texObj);
00297             texObj->CompareFunc = params[0];
00298             return;
00299          case GL_EQUAL:
00300          case GL_NOTEQUAL:
00301          case GL_LESS:
00302          case GL_GREATER:
00303          case GL_ALWAYS:
00304          case GL_NEVER:
00305             if (ctx->Extensions.EXT_shadow_funcs) {
00306                flush(ctx, texObj);
00307                texObj->CompareFunc = params[0];
00308                return;
00309             }
00310             /* fall-through */
00311          default:
00312             _mesa_error(ctx, GL_INVALID_ENUM,
00313                         "glTexParameter(GL_TEXTURE_COMPARE_FUNC_ARB)");
00314          }
00315       }
00316       else {
00317          _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(param)");
00318       }
00319       return;
00320 
00321    case GL_DEPTH_TEXTURE_MODE_ARB:
00322       if (ctx->Extensions.ARB_depth_texture &&
00323           (params[0] == GL_LUMINANCE ||
00324            params[0] == GL_INTENSITY ||
00325            params[0] == GL_ALPHA)) {
00326          if (texObj->DepthMode != params[0]) {
00327             flush(ctx, texObj);
00328             texObj->DepthMode = params[0];
00329          }
00330       }
00331       else {
00332          _mesa_error(ctx, GL_INVALID_ENUM,
00333                      "glTexParameter(GL_DEPTH_TEXTURE_MODE_ARB)");
00334       }
00335       return;
00336 
00337 #ifdef FEATURE_OES_draw_texture
00338    case GL_TEXTURE_CROP_RECT_OES:
00339       texObj->CropRect[0] = params[0];
00340       texObj->CropRect[1] = params[1];
00341       texObj->CropRect[2] = params[2];
00342       texObj->CropRect[3] = params[3];
00343       break;
00344 #endif
00345 
00346    default:
00347       _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(pname=0x%x)", pname);
00348    }
00349 }
00350 
00351 
00353 static void
00354 set_tex_parameterf(GLcontext *ctx,
00355                    struct gl_texture_object *texObj,
00356                    GLenum pname, const GLfloat *params)
00357 {
00358    switch (pname) {
00359    case GL_TEXTURE_MIN_LOD:
00360       if (texObj->MinLod == params[0])
00361          return;
00362       flush(ctx, texObj);
00363       texObj->MinLod = params[0];
00364       return;
00365 
00366    case GL_TEXTURE_MAX_LOD:
00367       if (texObj->MaxLod == params[0])
00368          return;
00369       flush(ctx, texObj);
00370       texObj->MaxLod = params[0];
00371       return;
00372 
00373    case GL_TEXTURE_PRIORITY:
00374       flush(ctx, texObj);
00375       texObj->Priority = CLAMP(params[0], 0.0F, 1.0F);
00376       return;
00377 
00378    case GL_TEXTURE_MAX_ANISOTROPY_EXT:
00379       if (ctx->Extensions.EXT_texture_filter_anisotropic) {
00380          if (texObj->MaxAnisotropy == params[0])
00381             return;
00382          if (params[0] < 1.0) {
00383             _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
00384             return;
00385          }
00386          flush(ctx, texObj);
00387          /* clamp to max, that's what NVIDIA does */
00388          texObj->MaxAnisotropy = MIN2(params[0],
00389                                       ctx->Const.MaxTextureMaxAnisotropy);
00390       }
00391       else {
00392          _mesa_error(ctx, GL_INVALID_ENUM,
00393                      "glTexParameter(pname=GL_TEXTURE_MAX_ANISOTROPY_EXT)");
00394       }
00395       return;
00396 
00397    case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
00398       if (ctx->Extensions.SGIX_shadow_ambient) {
00399          if (texObj->ShadowAmbient != params[0]) {
00400             flush(ctx, texObj);
00401             texObj->ShadowAmbient = CLAMP(params[0], 0.0F, 1.0F);
00402          }
00403       }
00404       else {
00405          _mesa_error(ctx, GL_INVALID_ENUM,
00406                      "glTexParameter(pname=GL_SHADOW_AMBIENT_SGIX)");
00407       }
00408       return;
00409 
00410    case GL_TEXTURE_LOD_BIAS:
00411       /* NOTE: this is really part of OpenGL 1.4, not EXT_texture_lod_bias */
00412       if (ctx->Extensions.EXT_texture_lod_bias) {
00413          if (texObj->LodBias != params[0]) {
00414             flush(ctx, texObj);
00415             texObj->LodBias = params[0];
00416          }
00417       }
00418       break;
00419 
00420    case GL_TEXTURE_BORDER_COLOR:
00421       flush(ctx, texObj);
00422       texObj->BorderColor[RCOMP] = params[0];
00423       texObj->BorderColor[GCOMP] = params[1];
00424       texObj->BorderColor[BCOMP] = params[2];
00425       texObj->BorderColor[ACOMP] = params[3];
00426       UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[RCOMP], params[0]);
00427       UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[GCOMP], params[1]);
00428       UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[BCOMP], params[2]);
00429       UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[ACOMP], params[3]);
00430       return;
00431 
00432    default:
00433       _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(pname=0x%x)", pname);
00434    }
00435 }
00436 
00437 
00438 void GLAPIENTRY
00439 _mesa_TexParameterf(GLenum target, GLenum pname, GLfloat param)
00440 {
00441    struct gl_texture_object *texObj;
00442    GET_CURRENT_CONTEXT(ctx);
00443    ASSERT_OUTSIDE_BEGIN_END(ctx);
00444 
00445    texObj = get_texobj(ctx, target);
00446    if (!texObj)
00447       return;
00448 
00449    switch (pname) {
00450    case GL_TEXTURE_MIN_FILTER:
00451    case GL_TEXTURE_MAG_FILTER:
00452    case GL_TEXTURE_WRAP_S:
00453    case GL_TEXTURE_WRAP_T:
00454    case GL_TEXTURE_WRAP_R:
00455    case GL_TEXTURE_BASE_LEVEL:
00456    case GL_TEXTURE_MAX_LEVEL:
00457    case GL_TEXTURE_COMPARE_SGIX:
00458    case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
00459    case GL_GENERATE_MIPMAP_SGIS:
00460    case GL_TEXTURE_COMPARE_MODE_ARB:
00461    case GL_TEXTURE_COMPARE_FUNC_ARB:
00462    case GL_DEPTH_TEXTURE_MODE_ARB:
00463       {
00464          /* convert float param to int */
00465          GLint p = (GLint) param;
00466          set_tex_parameteri(ctx, texObj, pname, &p);
00467       }
00468       return;
00469    default:
00470       /* this will generate an error if pname is illegal */
00471       set_tex_parameterf(ctx, texObj, pname, &param);
00472    }
00473 
00474    if (ctx->Driver.TexParameter && ctx->ErrorValue == GL_NO_ERROR) {
00475       ctx->Driver.TexParameter(ctx, target, texObj, pname, &param);
00476    }
00477 }
00478 
00479 
00480 void GLAPIENTRY
00481 _mesa_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
00482 {
00483    struct gl_texture_object *texObj;
00484    GET_CURRENT_CONTEXT(ctx);
00485    ASSERT_OUTSIDE_BEGIN_END(ctx);
00486 
00487    texObj = get_texobj(ctx, target);
00488    if (!texObj)
00489       return;
00490 
00491    switch (pname) {
00492    case GL_TEXTURE_MIN_FILTER:
00493    case GL_TEXTURE_MAG_FILTER:
00494    case GL_TEXTURE_WRAP_S:
00495    case GL_TEXTURE_WRAP_T:
00496    case GL_TEXTURE_WRAP_R:
00497    case GL_TEXTURE_BASE_LEVEL:
00498    case GL_TEXTURE_MAX_LEVEL:
00499    case GL_TEXTURE_COMPARE_SGIX:
00500    case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
00501    case GL_GENERATE_MIPMAP_SGIS:
00502    case GL_TEXTURE_COMPARE_MODE_ARB:
00503    case GL_TEXTURE_COMPARE_FUNC_ARB:
00504    case GL_DEPTH_TEXTURE_MODE_ARB:
00505       {
00506          /* convert float param to int */
00507          GLint p = (GLint) params[0];
00508          set_tex_parameteri(ctx, texObj, pname, &p);
00509       }
00510       break;
00511 
00512 #ifdef FEATURE_OES_draw_texture
00513    case GL_TEXTURE_CROP_RECT_OES:
00514       {
00515          /* convert float params to int */
00516          GLint iparams[4];
00517          iparams[0] = (GLint) params[0];
00518          iparams[1] = (GLint) params[1];
00519          iparams[2] = (GLint) params[2];
00520          iparams[3] = (GLint) params[3];
00521          set_tex_parameteri(ctx, target, iparams);
00522       }
00523       break;
00524 #endif
00525 
00526    default:
00527       /* this will generate an error if pname is illegal */
00528       set_tex_parameterf(ctx, texObj, pname, params);
00529    }
00530 
00531    if (ctx->Driver.TexParameter && ctx->ErrorValue == GL_NO_ERROR) {
00532       ctx->Driver.TexParameter(ctx, target, texObj, pname, params);
00533    }
00534 }
00535 
00536 
00537 void GLAPIENTRY
00538 _mesa_TexParameteri(GLenum target, GLenum pname, GLint param)
00539 {
00540    struct gl_texture_object *texObj;
00541    GET_CURRENT_CONTEXT(ctx);
00542    ASSERT_OUTSIDE_BEGIN_END(ctx);
00543 
00544    texObj = get_texobj(ctx, target);
00545    if (!texObj)
00546       return;
00547 
00548    switch (pname) {
00549    case GL_TEXTURE_MIN_LOD:
00550    case GL_TEXTURE_MAX_LOD:
00551    case GL_TEXTURE_PRIORITY:
00552    case GL_TEXTURE_MAX_ANISOTROPY_EXT:
00553    case GL_TEXTURE_LOD_BIAS:
00554    case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
00555       {
00556          GLfloat fparam = (GLfloat) param;
00557          /* convert int param to float */
00558          set_tex_parameterf(ctx, texObj, pname, &fparam);
00559       }
00560       break;
00561    default:
00562       /* this will generate an error if pname is illegal */
00563       set_tex_parameteri(ctx, texObj, pname, &param);
00564    }
00565 
00566    if (ctx->Driver.TexParameter && ctx->ErrorValue == GL_NO_ERROR) {
00567       GLfloat fparam = (GLfloat) param;
00568       ctx->Driver.TexParameter(ctx, target, texObj, pname, &fparam);
00569    }
00570 }
00571 
00572 
00573 void GLAPIENTRY
00574 _mesa_TexParameteriv(GLenum target, GLenum pname, const GLint *params)
00575 {
00576    struct gl_texture_object *texObj;
00577    GET_CURRENT_CONTEXT(ctx);
00578    ASSERT_OUTSIDE_BEGIN_END(ctx);
00579 
00580    texObj = get_texobj(ctx, target);
00581    if (!texObj)
00582       return;
00583 
00584    switch (pname) {
00585    case GL_TEXTURE_BORDER_COLOR:
00586       {
00587          /* convert int params to float */
00588          GLfloat fparams[4];
00589          fparams[0] = INT_TO_FLOAT(params[0]);
00590          fparams[1] = INT_TO_FLOAT(params[1]);
00591          fparams[2] = INT_TO_FLOAT(params[2]);
00592          fparams[3] = INT_TO_FLOAT(params[3]);
00593          set_tex_parameterf(ctx, texObj, pname, fparams);
00594       }
00595       break;
00596    case GL_TEXTURE_MIN_LOD:
00597    case GL_TEXTURE_MAX_LOD:
00598    case GL_TEXTURE_PRIORITY:
00599    case GL_TEXTURE_MAX_ANISOTROPY_EXT:
00600    case GL_TEXTURE_LOD_BIAS:
00601    case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
00602       {
00603          /* convert int param to float */
00604          GLfloat fparam = (GLfloat) params[0];
00605          set_tex_parameterf(ctx, texObj, pname, &fparam);
00606       }
00607       break;
00608    default:
00609       /* this will generate an error if pname is illegal */
00610       set_tex_parameteri(ctx, texObj, pname, params);
00611    }
00612 
00613    if (ctx->Driver.TexParameter && ctx->ErrorValue == GL_NO_ERROR) {
00614       GLfloat fparams[4];
00615       fparams[0] = INT_TO_FLOAT(params[0]);
00616       if (pname == GL_TEXTURE_BORDER_COLOR ||
00617           pname == GL_TEXTURE_CROP_RECT_OES) {
00618          fparams[1] = INT_TO_FLOAT(params[1]);
00619          fparams[2] = INT_TO_FLOAT(params[2]);
00620          fparams[3] = INT_TO_FLOAT(params[3]);
00621       }
00622       ctx->Driver.TexParameter(ctx, target, texObj, pname, fparams);
00623    }
00624 }
00625 
00626 
00627 void GLAPIENTRY
00628 _mesa_GetTexLevelParameterfv( GLenum target, GLint level,
00629                               GLenum pname, GLfloat *params )
00630 {
00631    GLint iparam;
00632    _mesa_GetTexLevelParameteriv( target, level, pname, &iparam );
00633    *params = (GLfloat) iparam;
00634 }
00635 
00636 
00637 static GLuint
00638 tex_image_dimensions(GLcontext *ctx, GLenum target)
00639 {
00640    switch (target) {
00641       case GL_TEXTURE_1D:
00642       case GL_PROXY_TEXTURE_1D:
00643          return 1;
00644       case GL_TEXTURE_2D:
00645       case GL_PROXY_TEXTURE_2D:
00646          return 2;
00647       case GL_TEXTURE_3D:
00648       case GL_PROXY_TEXTURE_3D:
00649          return 3;
00650       case GL_TEXTURE_CUBE_MAP:
00651       case GL_PROXY_TEXTURE_CUBE_MAP:
00652       case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
00653       case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
00654       case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
00655       case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
00656       case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
00657       case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
00658          return ctx->Extensions.ARB_texture_cube_map ? 2 : 0;
00659       case GL_TEXTURE_RECTANGLE_NV:
00660       case GL_PROXY_TEXTURE_RECTANGLE_NV:
00661          return ctx->Extensions.NV_texture_rectangle ? 2 : 0;
00662       case GL_TEXTURE_1D_ARRAY_EXT:
00663       case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
00664          return ctx->Extensions.MESA_texture_array ? 2 : 0;
00665       case GL_TEXTURE_2D_ARRAY_EXT:
00666       case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
00667          return ctx->Extensions.MESA_texture_array ? 3 : 0;
00668       default:
00669          _mesa_problem(ctx, "bad target in _mesa_tex_target_dimensions()");
00670          return 0;
00671    }
00672 }
00673 
00674 
00675 void GLAPIENTRY
00676 _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
00677                               GLenum pname, GLint *params )
00678 {
00679    const struct gl_texture_unit *texUnit;
00680    struct gl_texture_object *texObj;
00681    const struct gl_texture_image *img = NULL;
00682    GLuint dimensions;
00683    GLboolean isProxy;
00684    GLint maxLevels;
00685    GET_CURRENT_CONTEXT(ctx);
00686    ASSERT_OUTSIDE_BEGIN_END(ctx);
00687 
00688    if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
00689       _mesa_error(ctx, GL_INVALID_OPERATION,
00690                   "glGetTexLevelParameteriv(current unit)");
00691       return;
00692    }
00693 
00694    texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
00695 
00696    /* this will catch bad target values */
00697    dimensions = tex_image_dimensions(ctx, target);  /* 1, 2 or 3 */
00698    if (dimensions == 0) {
00699       _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)");
00700       return;
00701    }
00702 
00703    maxLevels = _mesa_max_texture_levels(ctx, target);
00704    if (maxLevels == 0) {
00705       /* should not happen since <target> was just checked above */
00706       _mesa_problem(ctx, "maxLevels=0 in _mesa_GetTexLevelParameter");
00707       return;
00708    }
00709 
00710    if (level < 0 || level >= maxLevels) {
00711       _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" );
00712       return;
00713    }
00714 
00715    texObj = _mesa_select_tex_object(ctx, texUnit, target);
00716    _mesa_lock_texture(ctx, texObj);
00717 
00718    img = _mesa_select_tex_image(ctx, texObj, target, level);
00719    if (!img || !img->TexFormat) {
00720       /* undefined texture image */
00721       if (pname == GL_TEXTURE_COMPONENTS)
00722          *params = 1;
00723       else
00724          *params = 0;
00725       goto out;
00726    }
00727 
00728    isProxy = _mesa_is_proxy_texture(target);
00729 
00730    switch (pname) {
00731       case GL_TEXTURE_WIDTH:
00732          *params = img->Width;
00733          break;
00734       case GL_TEXTURE_HEIGHT:
00735          *params = img->Height;
00736          break;
00737       case GL_TEXTURE_DEPTH:
00738          *params = img->Depth;
00739          break;
00740       case GL_TEXTURE_INTERNAL_FORMAT:
00741          *params = img->InternalFormat;
00742          break;
00743       case GL_TEXTURE_BORDER:
00744          *params = img->Border;
00745          break;
00746       case GL_TEXTURE_RED_SIZE:
00747          if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA)
00748             *params = img->TexFormat->RedBits;
00749          else
00750             *params = 0;
00751          break;
00752       case GL_TEXTURE_GREEN_SIZE:
00753          if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA)
00754             *params = img->TexFormat->GreenBits;
00755          else
00756             *params = 0;
00757          break;
00758       case GL_TEXTURE_BLUE_SIZE:
00759          if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA)
00760             *params = img->TexFormat->BlueBits;
00761          else
00762             *params = 0;
00763          break;
00764       case GL_TEXTURE_ALPHA_SIZE:
00765          if (img->_BaseFormat == GL_ALPHA ||
00766              img->_BaseFormat == GL_LUMINANCE_ALPHA ||
00767              img->_BaseFormat == GL_RGBA)
00768             *params = img->TexFormat->AlphaBits;
00769          else
00770             *params = 0;
00771          break;
00772       case GL_TEXTURE_INTENSITY_SIZE:
00773          if (img->_BaseFormat != GL_INTENSITY)
00774             *params = 0;
00775          else if (img->TexFormat->IntensityBits > 0)
00776             *params = img->TexFormat->IntensityBits;
00777          else /* intensity probably stored as rgb texture */
00778             *params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits);
00779          break;
00780       case GL_TEXTURE_LUMINANCE_SIZE:
00781          if (img->_BaseFormat != GL_LUMINANCE &&
00782              img->_BaseFormat != GL_LUMINANCE_ALPHA)
00783             *params = 0;
00784          else if (img->TexFormat->LuminanceBits > 0)
00785             *params = img->TexFormat->LuminanceBits;
00786          else /* luminance probably stored as rgb texture */
00787             *params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits);
00788          break;
00789       case GL_TEXTURE_INDEX_SIZE_EXT:
00790          if (img->_BaseFormat == GL_COLOR_INDEX)
00791             *params = img->TexFormat->IndexBits;
00792          else
00793             *params = 0;
00794          break;
00795       case GL_TEXTURE_DEPTH_SIZE_ARB:
00796          if (ctx->Extensions.ARB_depth_texture)
00797             *params = img->TexFormat->DepthBits;
00798          else
00799             _mesa_error(ctx, GL_INVALID_ENUM,
00800                         "glGetTexLevelParameter[if]v(pname)");
00801          break;
00802       case GL_TEXTURE_STENCIL_SIZE_EXT:
00803          if (ctx->Extensions.EXT_packed_depth_stencil) {
00804             *params = img->TexFormat->StencilBits;
00805          }
00806          else {
00807             _mesa_error(ctx, GL_INVALID_ENUM,
00808                         "glGetTexLevelParameter[if]v(pname)");
00809          }
00810          break;
00811 
00812       /* GL_ARB_texture_compression */
00813       case GL_TEXTURE_COMPRESSED_IMAGE_SIZE:
00814          if (ctx->Extensions.ARB_texture_compression) {
00815             if (img->IsCompressed && !isProxy) {
00816                /* Don't use ctx->Driver.CompressedTextureSize() since that
00817                 * may returned a padded hardware size.
00818                 */
00819                *params = _mesa_compressed_texture_size(ctx, img->Width,
00820                                                    img->Height, img->Depth,
00821                                                    img->TexFormat->MesaFormat);
00822             }
00823             else {
00824                _mesa_error(ctx, GL_INVALID_OPERATION,
00825                            "glGetTexLevelParameter[if]v(pname)");
00826             }
00827          }
00828          else {
00829             _mesa_error(ctx, GL_INVALID_ENUM,
00830                         "glGetTexLevelParameter[if]v(pname)");
00831          }
00832          break;
00833       case GL_TEXTURE_COMPRESSED:
00834          if (ctx->Extensions.ARB_texture_compression) {
00835             *params = (GLint) img->IsCompressed;
00836          }
00837          else {
00838             _mesa_error(ctx, GL_INVALID_ENUM,
00839                         "glGetTexLevelParameter[if]v(pname)");
00840          }
00841          break;
00842 
00843       /* GL_ARB_texture_float */
00844       case GL_TEXTURE_RED_TYPE_ARB:
00845          if (ctx->Extensions.ARB_texture_float) {
00846             *params = img->TexFormat->RedBits ? img->TexFormat->DataType : GL_NONE;
00847          }
00848          else {
00849             _mesa_error(ctx, GL_INVALID_ENUM,
00850                         "glGetTexLevelParameter[if]v(pname)");
00851          }
00852          break;
00853       case GL_TEXTURE_GREEN_TYPE_ARB:
00854          if (ctx->Extensions.ARB_texture_float) {
00855             *params = img->TexFormat->GreenBits ? img->TexFormat->DataType : GL_NONE;
00856          }
00857          else {
00858             _mesa_error(ctx, GL_INVALID_ENUM,
00859                         "glGetTexLevelParameter[if]v(pname)");
00860          }
00861          break;
00862       case GL_TEXTURE_BLUE_TYPE_ARB:
00863          if (ctx->Extensions.ARB_texture_float) {
00864             *params = img->TexFormat->BlueBits ? img->TexFormat->DataType : GL_NONE;
00865          }
00866          else {
00867             _mesa_error(ctx, GL_INVALID_ENUM,
00868                         "glGetTexLevelParameter[if]v(pname)");
00869          }
00870          break;
00871       case GL_TEXTURE_ALPHA_TYPE_ARB:
00872          if (ctx->Extensions.ARB_texture_float) {
00873             *params = img->TexFormat->AlphaBits ? img->TexFormat->DataType : GL_NONE;
00874          }
00875          else {
00876             _mesa_error(ctx, GL_INVALID_ENUM,
00877                         "glGetTexLevelParameter[if]v(pname)");
00878          }
00879          break;
00880       case GL_TEXTURE_LUMINANCE_TYPE_ARB:
00881          if (ctx->Extensions.ARB_texture_float) {
00882             *params = img->TexFormat->LuminanceBits ? img->TexFormat->DataType : GL_NONE;
00883          }
00884          else {
00885             _mesa_error(ctx, GL_INVALID_ENUM,
00886                         "glGetTexLevelParameter[if]v(pname)");
00887          }
00888          break;
00889       case GL_TEXTURE_INTENSITY_TYPE_ARB:
00890          if (ctx->Extensions.ARB_texture_float) {
00891             *params = img->TexFormat->IntensityBits ? img->TexFormat->DataType : GL_NONE;
00892          }
00893          else {
00894             _mesa_error(ctx, GL_INVALID_ENUM,
00895                         "glGetTexLevelParameter[if]v(pname)");
00896          }
00897          break;
00898       case GL_TEXTURE_DEPTH_TYPE_ARB:
00899          if (ctx->Extensions.ARB_texture_float) {
00900             *params = img->TexFormat->DepthBits ? img->TexFormat->DataType : GL_NONE;
00901          }
00902          else {
00903             _mesa_error(ctx, GL_INVALID_ENUM,
00904                         "glGetTexLevelParameter[if]v(pname)");
00905          }
00906          break;
00907 
00908       default:
00909          _mesa_error(ctx, GL_INVALID_ENUM,
00910                      "glGetTexLevelParameter[if]v(pname)");
00911    }
00912 
00913  out:
00914    _mesa_unlock_texture(ctx, texObj);
00915 }
00916 
00917 
00918 
00919 void GLAPIENTRY
00920 _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
00921 {
00922    struct gl_texture_unit *texUnit;
00923    struct gl_texture_object *obj;
00924    GLboolean error = GL_FALSE;
00925    GET_CURRENT_CONTEXT(ctx);
00926    ASSERT_OUTSIDE_BEGIN_END(ctx);
00927 
00928    if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
00929       _mesa_error(ctx, GL_INVALID_OPERATION,
00930                   "glGetTexParameterfv(current unit)");
00931       return;
00932    }
00933 
00934    texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
00935 
00936    obj = _mesa_select_tex_object(ctx, texUnit, target);
00937    if (!obj) {
00938       _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(target)");
00939       return;
00940    }
00941 
00942    _mesa_lock_texture(ctx, obj);
00943    switch (pname) {
00944       case GL_TEXTURE_MAG_FILTER:
00945      *params = ENUM_TO_FLOAT(obj->MagFilter);
00946      break;
00947       case GL_TEXTURE_MIN_FILTER:
00948          *params = ENUM_TO_FLOAT(obj->MinFilter);
00949          break;
00950       case GL_TEXTURE_WRAP_S:
00951          *params = ENUM_TO_FLOAT(obj->WrapS);
00952          break;
00953       case GL_TEXTURE_WRAP_T:
00954          *params = ENUM_TO_FLOAT(obj->WrapT);
00955          break;
00956       case GL_TEXTURE_WRAP_R:
00957          *params = ENUM_TO_FLOAT(obj->WrapR);
00958          break;
00959       case GL_TEXTURE_BORDER_COLOR:
00960          params[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F);
00961          params[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F);
00962          params[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F);
00963          params[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F);
00964          break;
00965       case GL_TEXTURE_RESIDENT:
00966          {
00967             GLboolean resident;
00968             if (ctx->Driver.IsTextureResident)
00969                resident = ctx->Driver.IsTextureResident(ctx, obj);
00970             else
00971                resident = GL_TRUE;
00972             *params = ENUM_TO_FLOAT(resident);
00973          }
00974          break;
00975       case GL_TEXTURE_PRIORITY:
00976          *params = obj->Priority;
00977          break;
00978       case GL_TEXTURE_MIN_LOD:
00979          *params = obj->MinLod;
00980          break;
00981       case GL_TEXTURE_MAX_LOD:
00982          *params = obj->MaxLod;
00983          break;
00984       case GL_TEXTURE_BASE_LEVEL:
00985          *params = (GLfloat) obj->BaseLevel;
00986          break;
00987       case GL_TEXTURE_MAX_LEVEL:
00988          *params = (GLfloat) obj->MaxLevel;
00989          break;
00990       case GL_TEXTURE_MAX_ANISOTROPY_EXT:
00991          if (ctx->Extensions.EXT_texture_filter_anisotropic) {
00992             *params = obj->MaxAnisotropy;
00993          }
00994      else
00995         error = 1;
00996          break;
00997       case GL_TEXTURE_COMPARE_SGIX:
00998          if (ctx->Extensions.SGIX_shadow) {
00999             *params = (GLfloat) obj->CompareFlag;
01000          }
01001      else 
01002         error = 1;
01003          break;
01004       case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
01005          if (ctx->Extensions.SGIX_shadow) {
01006             *params = (GLfloat) obj->CompareOperator;
01007          }
01008      else 
01009         error = 1;
01010          break;
01011       case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
01012          if (ctx->Extensions.SGIX_shadow_ambient) {
01013             *params = obj->ShadowAmbient;
01014          }
01015      else 
01016         error = 1;
01017          break;
01018       case GL_GENERATE_MIPMAP_SGIS:
01019          if (ctx->Extensions.SGIS_generate_mipmap) {
01020             *params = (GLfloat) obj->GenerateMipmap;
01021          }
01022      else 
01023         error = 1;
01024          break;
01025       case GL_TEXTURE_COMPARE_MODE_ARB:
01026          if (ctx->Extensions.ARB_shadow) {
01027             *params = (GLfloat) obj->CompareMode;
01028          }
01029      else 
01030         error = 1;
01031          break;
01032       case GL_TEXTURE_COMPARE_FUNC_ARB:
01033          if (ctx->Extensions.ARB_shadow) {
01034             *params = (GLfloat) obj->CompareFunc;
01035          }
01036      else 
01037         error = 1;
01038          break;
01039       case GL_DEPTH_TEXTURE_MODE_ARB:
01040          if (ctx->Extensions.ARB_depth_texture) {
01041             *params = (GLfloat) obj->DepthMode;
01042          }
01043      else 
01044         error = 1;
01045          break;
01046       case GL_TEXTURE_LOD_BIAS:
01047          if (ctx->Extensions.EXT_texture_lod_bias) {
01048             *params = obj->LodBias;
01049          }
01050      else 
01051         error = 1;
01052          break;
01053 #ifdef FEATURE_OES_draw_texture
01054       case GL_TEXTURE_CROP_RECT_OES:
01055          params[0] = obj->CropRect[0];
01056          params[1] = obj->CropRect[1];
01057          params[2] = obj->CropRect[2];
01058          params[3] = obj->CropRect[3];
01059          break;
01060 #endif
01061       default:
01062      error = 1;
01063      break;
01064    }
01065    if (error)
01066       _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname=0x%x)",
01067           pname);
01068 
01069    _mesa_unlock_texture(ctx, obj);
01070 }
01071 
01072 
01073 void GLAPIENTRY
01074 _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params )
01075 {
01076    struct gl_texture_unit *texUnit;
01077    struct gl_texture_object *obj;
01078    GET_CURRENT_CONTEXT(ctx);
01079    ASSERT_OUTSIDE_BEGIN_END(ctx);
01080 
01081    if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
01082       _mesa_error(ctx, GL_INVALID_OPERATION,
01083                   "glGetTexParameteriv(current unit)");
01084       return;
01085    }
01086 
01087    texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
01088 
01089    obj = _mesa_select_tex_object(ctx, texUnit, target);
01090    if (!obj) {
01091       _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(target)");
01092       return;
01093    }
01094 
01095    switch (pname) {
01096       case GL_TEXTURE_MAG_FILTER:
01097          *params = (GLint) obj->MagFilter;
01098          return;
01099       case GL_TEXTURE_MIN_FILTER:
01100          *params = (GLint) obj->MinFilter;
01101          return;
01102       case GL_TEXTURE_WRAP_S:
01103          *params = (GLint) obj->WrapS;
01104          return;
01105       case GL_TEXTURE_WRAP_T:
01106          *params = (GLint) obj->WrapT;
01107          return;
01108       case GL_TEXTURE_WRAP_R:
01109          *params = (GLint) obj->WrapR;
01110          return;
01111       case GL_TEXTURE_BORDER_COLOR:
01112          {
01113             GLfloat b[4];
01114             b[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F);
01115             b[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F);
01116             b[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F);
01117             b[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F);
01118             params[0] = FLOAT_TO_INT(b[0]);
01119             params[1] = FLOAT_TO_INT(b[1]);
01120             params[2] = FLOAT_TO_INT(b[2]);
01121             params[3] = FLOAT_TO_INT(b[3]);
01122          }
01123          return;
01124       case GL_TEXTURE_RESIDENT:
01125          {
01126             GLboolean resident;
01127             if (ctx->Driver.IsTextureResident)
01128                resident = ctx->Driver.IsTextureResident(ctx, obj);
01129             else
01130                resident = GL_TRUE;
01131             *params = (GLint) resident;
01132          }
01133          return;
01134       case GL_TEXTURE_PRIORITY:
01135          *params = FLOAT_TO_INT(obj->Priority);
01136          return;
01137       case GL_TEXTURE_MIN_LOD:
01138          *params = (GLint) obj->MinLod;
01139          return;
01140       case GL_TEXTURE_MAX_LOD:
01141          *params = (GLint) obj->MaxLod;
01142          return;
01143       case GL_TEXTURE_BASE_LEVEL:
01144          *params = obj->BaseLevel;
01145          return;
01146       case GL_TEXTURE_MAX_LEVEL:
01147          *params = obj->MaxLevel;
01148          return;
01149       case GL_TEXTURE_MAX_ANISOTROPY_EXT:
01150          if (ctx->Extensions.EXT_texture_filter_anisotropic) {
01151             *params = (GLint) obj->MaxAnisotropy;
01152             return;
01153          }
01154          break;
01155       case GL_TEXTURE_COMPARE_SGIX:
01156          if (ctx->Extensions.SGIX_shadow) {
01157             *params = (GLint) obj->CompareFlag;
01158             return;
01159          }
01160          break;
01161       case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
01162          if (ctx->Extensions.SGIX_shadow) {
01163             *params = (GLint) obj->CompareOperator;
01164             return;
01165          }
01166          break;
01167       case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
01168          if (ctx->Extensions.SGIX_shadow_ambient) {
01169             *params = (GLint) FLOAT_TO_INT(obj->ShadowAmbient);
01170             return;
01171          }
01172          break;
01173       case GL_GENERATE_MIPMAP_SGIS:
01174          if (ctx->Extensions.SGIS_generate_mipmap) {
01175             *params = (GLint) obj->GenerateMipmap;
01176             return;
01177          }
01178          break;
01179       case GL_TEXTURE_COMPARE_MODE_ARB:
01180          if (ctx->Extensions.ARB_shadow) {
01181             *params = (GLint) obj->CompareMode;
01182             return;
01183          }
01184          break;
01185       case GL_TEXTURE_COMPARE_FUNC_ARB:
01186          if (ctx->Extensions.ARB_shadow) {
01187             *params = (GLint) obj->CompareFunc;
01188             return;
01189          }
01190          break;
01191       case GL_DEPTH_TEXTURE_MODE_ARB:
01192          if (ctx->Extensions.ARB_depth_texture) {
01193             *params = (GLint) obj->DepthMode;
01194             return;
01195          }
01196          break;
01197       case GL_TEXTURE_LOD_BIAS:
01198          if (ctx->Extensions.EXT_texture_lod_bias) {
01199             *params = (GLint) obj->LodBias;
01200             return;
01201          }
01202          break;
01203 #ifdef FEATURE_OES_draw_texture
01204       case GL_TEXTURE_CROP_RECT_OES:
01205          params[0] = obj->CropRect[0];
01206          params[1] = obj->CropRect[1];
01207          params[2] = obj->CropRect[2];
01208          params[3] = obj->CropRect[3];
01209          break;
01210 #endif
01211       default:
01212          ; /* silence warnings */
01213    }
01214    /* If we get here, pname was an unrecognized enum */
01215    _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname=0x%x)", pname);
01216 }

Generated on Sat May 26 2012 04:19:15 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.