⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 texstate.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
void GLAPIENTRY_mesa_TexParameterf( GLenum target, GLenum pname, GLfloat param ){   _mesa_TexParameterfv(target, pname, &param);}void GLAPIENTRY_mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params ){   const GLenum eparam = (GLenum) (GLint) params[0];   struct gl_texture_unit *texUnit;   struct gl_texture_object *texObj;   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END(ctx);   if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))      _mesa_debug(ctx, "glTexParameter %s %s %.1f(%s)...\n",                  _mesa_lookup_enum_by_nr(target),                  _mesa_lookup_enum_by_nr(pname),                  *params,		  _mesa_lookup_enum_by_nr(eparam));   if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameterfv(current unit)");      return;   }   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];   switch (target) {      case GL_TEXTURE_1D:         texObj = texUnit->Current1D;         break;      case GL_TEXTURE_2D:         texObj = texUnit->Current2D;         break;      case GL_TEXTURE_3D:         texObj = texUnit->Current3D;         break;      case GL_TEXTURE_CUBE_MAP:         if (!ctx->Extensions.ARB_texture_cube_map) {            _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );            return;         }         texObj = texUnit->CurrentCubeMap;         break;      case GL_TEXTURE_RECTANGLE_NV:         if (!ctx->Extensions.NV_texture_rectangle) {            _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );            return;         }         texObj = texUnit->CurrentRect;         break;      case GL_TEXTURE_1D_ARRAY_EXT:         if (!ctx->Extensions.MESA_texture_array) {            _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );            return;         }         texObj = texUnit->Current1DArray;         break;      case GL_TEXTURE_2D_ARRAY_EXT:         if (!ctx->Extensions.MESA_texture_array) {            _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );            return;         }         texObj = texUnit->Current2DArray;         break;      default:         _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );         return;   }   switch (pname) {      case GL_TEXTURE_MIN_FILTER:         /* A small optimization */         if (texObj->MinFilter == eparam)            return;         if (eparam==GL_NEAREST || eparam==GL_LINEAR) {            FLUSH_VERTICES(ctx, _NEW_TEXTURE);            texObj->MinFilter = eparam;         }         else if ((eparam==GL_NEAREST_MIPMAP_NEAREST ||                   eparam==GL_LINEAR_MIPMAP_NEAREST ||                   eparam==GL_NEAREST_MIPMAP_LINEAR ||                   eparam==GL_LINEAR_MIPMAP_LINEAR) &&                  texObj->Target != GL_TEXTURE_RECTANGLE_NV) {            FLUSH_VERTICES(ctx, _NEW_TEXTURE);            texObj->MinFilter = eparam;         }         else {            _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );            return;         }         break;      case GL_TEXTURE_MAG_FILTER:         /* A small optimization */         if (texObj->MagFilter == eparam)            return;         if (eparam==GL_NEAREST || eparam==GL_LINEAR) {            FLUSH_VERTICES(ctx, _NEW_TEXTURE);            texObj->MagFilter = eparam;         }         else {            _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );            return;         }         break;      case GL_TEXTURE_WRAP_S:         if (texObj->WrapS == eparam)            return;         if (validate_texture_wrap_mode(ctx, texObj->Target, eparam)) {            FLUSH_VERTICES(ctx, _NEW_TEXTURE);            texObj->WrapS = eparam;         }         else {            return;         }         break;      case GL_TEXTURE_WRAP_T:         if (texObj->WrapT == eparam)            return;         if (validate_texture_wrap_mode(ctx, texObj->Target, eparam)) {            FLUSH_VERTICES(ctx, _NEW_TEXTURE);            texObj->WrapT = eparam;         }         else {            return;         }         break;      case GL_TEXTURE_WRAP_R:         if (texObj->WrapR == eparam)            return;         if (validate_texture_wrap_mode(ctx, texObj->Target, eparam)) {            FLUSH_VERTICES(ctx, _NEW_TEXTURE);            texObj->WrapR = eparam;         }         else {	    return;         }         break;      case GL_TEXTURE_BORDER_COLOR:         FLUSH_VERTICES(ctx, _NEW_TEXTURE);         texObj->BorderColor[RCOMP] = params[0];         texObj->BorderColor[GCOMP] = params[1];         texObj->BorderColor[BCOMP] = params[2];         texObj->BorderColor[ACOMP] = params[3];         UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[RCOMP], params[0]);         UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[GCOMP], params[1]);         UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[BCOMP], params[2]);         UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[ACOMP], params[3]);         break;      case GL_TEXTURE_MIN_LOD:         if (texObj->MinLod == params[0])            return;         FLUSH_VERTICES(ctx, _NEW_TEXTURE);         texObj->MinLod = params[0];         break;      case GL_TEXTURE_MAX_LOD:         if (texObj->MaxLod == params[0])            return;         FLUSH_VERTICES(ctx, _NEW_TEXTURE);         texObj->MaxLod = params[0];         break;      case GL_TEXTURE_BASE_LEVEL:         if (params[0] < 0.0) {            _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)");            return;         }         if (target == GL_TEXTURE_RECTANGLE_ARB && params[0] != 0.0) {            _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)");            return;         }         FLUSH_VERTICES(ctx, _NEW_TEXTURE);         texObj->BaseLevel = (GLint) params[0];         break;      case GL_TEXTURE_MAX_LEVEL:         if (params[0] < 0.0) {            _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)");            return;         }         if (target == GL_TEXTURE_RECTANGLE_ARB) {            _mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameter(param)");            return;         }         FLUSH_VERTICES(ctx, _NEW_TEXTURE);         texObj->MaxLevel = (GLint) params[0];         break;      case GL_TEXTURE_PRIORITY:         FLUSH_VERTICES(ctx, _NEW_TEXTURE);         texObj->Priority = CLAMP( params[0], 0.0F, 1.0F );         break;      case GL_TEXTURE_MAX_ANISOTROPY_EXT:         if (ctx->Extensions.EXT_texture_filter_anisotropic) {	    if (params[0] < 1.0) {	       _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" );	       return;	    }            FLUSH_VERTICES(ctx, _NEW_TEXTURE);            /* clamp to max, that's what NVIDIA does */            texObj->MaxAnisotropy = MIN2(params[0],                                         ctx->Const.MaxTextureMaxAnisotropy);         }         else {            _mesa_error(ctx, GL_INVALID_ENUM,                        "glTexParameter(pname=GL_TEXTURE_MAX_ANISOTROPY_EXT)");            return;         }         break;      case GL_TEXTURE_COMPARE_SGIX:         if (ctx->Extensions.SGIX_shadow) {            FLUSH_VERTICES(ctx, _NEW_TEXTURE);            texObj->CompareFlag = params[0] ? GL_TRUE : GL_FALSE;         }         else {            _mesa_error(ctx, GL_INVALID_ENUM,                        "glTexParameter(pname=GL_TEXTURE_COMPARE_SGIX)");            return;         }         break;      case GL_TEXTURE_COMPARE_OPERATOR_SGIX:         if (ctx->Extensions.SGIX_shadow) {            GLenum op = (GLenum) params[0];            if (op == GL_TEXTURE_LEQUAL_R_SGIX ||                op == GL_TEXTURE_GEQUAL_R_SGIX) {               FLUSH_VERTICES(ctx, _NEW_TEXTURE);               texObj->CompareOperator = op;            }            else {               _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(param)");            }         }         else {            _mesa_error(ctx, GL_INVALID_ENUM,                    "glTexParameter(pname=GL_TEXTURE_COMPARE_OPERATOR_SGIX)");            return;         }         break;      case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */         if (ctx->Extensions.SGIX_shadow_ambient) {            FLUSH_VERTICES(ctx, _NEW_TEXTURE);            texObj->ShadowAmbient = CLAMP(params[0], 0.0F, 1.0F);         }         else {            _mesa_error(ctx, GL_INVALID_ENUM,                        "glTexParameter(pname=GL_SHADOW_AMBIENT_SGIX)");            return;         }         break;      case GL_GENERATE_MIPMAP_SGIS:         if (ctx->Extensions.SGIS_generate_mipmap) {            FLUSH_VERTICES(ctx, _NEW_TEXTURE);            texObj->GenerateMipmap = params[0] ? GL_TRUE : GL_FALSE;         }         else {            _mesa_error(ctx, GL_INVALID_ENUM,                        "glTexParameter(pname=GL_GENERATE_MIPMAP_SGIS)");            return;         }         break;      case GL_TEXTURE_COMPARE_MODE_ARB:         if (ctx->Extensions.ARB_shadow) {            const GLenum mode = (GLenum) params[0];            if (mode == GL_NONE || mode == GL_COMPARE_R_TO_TEXTURE_ARB) {               FLUSH_VERTICES(ctx, _NEW_TEXTURE);               texObj->CompareMode = mode;            }            else {               _mesa_error(ctx, GL_INVALID_ENUM,                           "glTexParameter(bad GL_TEXTURE_COMPARE_MODE_ARB: 0x%x)", mode);               return;            }         }         else {            _mesa_error(ctx, GL_INVALID_ENUM,                        "glTexParameter(pname=GL_TEXTURE_COMPARE_MODE_ARB)");            return;         }         break;      case GL_TEXTURE_COMPARE_FUNC_ARB:         if (ctx->Extensions.ARB_shadow) {            const GLenum func = (GLenum) params[0];            if (func == GL_LEQUAL || func == GL_GEQUAL) {               FLUSH_VERTICES(ctx, _NEW_TEXTURE);               texObj->CompareFunc = func;            }            else if (ctx->Extensions.EXT_shadow_funcs &&                     (func == GL_EQUAL ||                      func == GL_NOTEQUAL ||                      func == GL_LESS ||                      func == GL_GREATER ||                      func == GL_ALWAYS ||                      func == GL_NEVER)) {               FLUSH_VERTICES(ctx, _NEW_TEXTURE);               texObj->CompareFunc = func;            }            else {               _mesa_error(ctx, GL_INVALID_ENUM,                           "glTexParameter(bad GL_TEXTURE_COMPARE_FUNC_ARB)");               return;            }         }         else {            _mesa_error(ctx, GL_INVALID_ENUM,                        "glTexParameter(pname=GL_TEXTURE_COMPARE_FUNC_ARB)");            return;         }         break;      case GL_DEPTH_TEXTURE_MODE_ARB:         if (ctx->Extensions.ARB_depth_texture) {            const GLenum result = (GLenum) params[0];            if (result == GL_LUMINANCE || result == GL_INTENSITY                || result == GL_ALPHA) {               FLUSH_VERTICES(ctx, _NEW_TEXTURE);               texObj->DepthMode = result;            }            else {               _mesa_error(ctx, GL_INVALID_ENUM,                          "glTexParameter(bad GL_DEPTH_TEXTURE_MODE_ARB)");               return;            }         }         else {            _mesa_error(ctx, GL_INVALID_ENUM,                        "glTexParameter(pname=GL_DEPTH_TEXTURE_MODE_ARB)");            return;         }         break;      case GL_TEXTURE_LOD_BIAS:         /* NOTE: this is really part of OpenGL 1.4, not EXT_texture_lod_bias*/         if (ctx->Extensions.EXT_texture_lod_bias) {            if (texObj->LodBias != params[0]) {               FLUSH_VERTICES(ctx, _NEW_TEXTURE);               texObj->LodBias = params[0];            }         }         break;      default:         _mesa_error(ctx, GL_INVALID_ENUM,                     "glTexParameter(pname=0x%x)", pname);         return;   }   texObj->_Complete = GL_FALSE;   if (ctx->Driver.TexParameter) {      (*ctx->Driver.TexParameter)( ctx, target, texObj, pname, params );   }}void GLAPIENTRY_mesa_TexParameteri( GLenum target, GLenum pname, GLint param ){   GLfloat fparam[4];   if (pname == GL_TEXTURE_PRIORITY)      fparam[0] = INT_TO_FLOAT(param);   else      fparam[0] = (GLfloat) param;   fparam[1] = fparam[2] = fparam[3] = 0.0;   _mesa_TexParameterfv(target, pname, fparam);}void GLAPIENTRY_mesa_TexParameteriv( GLenum target, GLenum pname, const GLint *params ){   GLfloat fparam[4];   if (pname == GL_TEXTURE_BORDER_COLOR) {      fparam[0] = INT_TO_FLOAT(params[0]);      fparam[1] = INT_TO_FLOAT(params[1]);      fparam[2] = INT_TO_FLOAT(params[2]);      fparam[3] = INT_TO_FLOAT(params[3]);   }   else {      if (pname == GL_TEXTURE_PRIORITY)         fparam[0] = INT_TO_FLOAT(params[0]);      else         fparam[0] = (GLfloat) params[0];      fparam[1] = fparam[2] = fparam[3] = 0.0F;   }   _mesa_TexParameterfv(target, pname, fparam);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -