📄 texstate.c
字号:
void GLAPIENTRY_mesa_TexParameterf( GLenum target, GLenum pname, GLfloat param ){ _mesa_TexParameterfv(target, pname, ¶m);}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 + -