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

📄 texstate.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * Mesa 3-D graphics library * Version:  7.1 * * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *//**  * \file texstate.c * * Texture state handling. */#include "glheader.h"#include "colormac.h"#include "colortab.h"#include "context.h"#include "enums.h"#include "macros.h"#include "texcompress.h"#include "texobj.h"#include "teximage.h"#include "texstate.h"#include "texenvprogram.h"#include "mtypes.h"#include "math/m_xform.h"#define ENUM_TO_FLOAT(X) ((GLfloat)(GLint)(X))#define ENUM_TO_DOUBLE(X) ((GLdouble)(GLint)(X))/** * Default texture combine environment state.  This is used to initialize * a context's texture units and as the basis for converting "classic" * texture environmnets to ARB_texture_env_combine style values. */static const struct gl_tex_env_combine_state default_combine_state = {   GL_MODULATE, GL_MODULATE,   { GL_TEXTURE, GL_PREVIOUS, GL_CONSTANT },   { GL_TEXTURE, GL_PREVIOUS, GL_CONSTANT },   { GL_SRC_COLOR, GL_SRC_COLOR, GL_SRC_ALPHA },   { GL_SRC_ALPHA, GL_SRC_ALPHA, GL_SRC_ALPHA },   0, 0,   2, 2};/** * Used by glXCopyContext to copy texture state from one context to another. */void_mesa_copy_texture_state( const GLcontext *src, GLcontext *dst ){   GLuint i;   ASSERT(src);   ASSERT(dst);   dst->Texture.CurrentUnit = src->Texture.CurrentUnit;   dst->Texture._GenFlags = src->Texture._GenFlags;   dst->Texture._TexGenEnabled = src->Texture._TexGenEnabled;   dst->Texture._TexMatEnabled = src->Texture._TexMatEnabled;   dst->Texture.SharedPalette = src->Texture.SharedPalette;   /* per-unit state */   for (i = 0; i < src->Const.MaxTextureUnits; i++) {      dst->Texture.Unit[i].Enabled = src->Texture.Unit[i].Enabled;      dst->Texture.Unit[i].EnvMode = src->Texture.Unit[i].EnvMode;      COPY_4V(dst->Texture.Unit[i].EnvColor, src->Texture.Unit[i].EnvColor);      dst->Texture.Unit[i].TexGenEnabled = src->Texture.Unit[i].TexGenEnabled;      dst->Texture.Unit[i].GenModeS = src->Texture.Unit[i].GenModeS;      dst->Texture.Unit[i].GenModeT = src->Texture.Unit[i].GenModeT;      dst->Texture.Unit[i].GenModeR = src->Texture.Unit[i].GenModeR;      dst->Texture.Unit[i].GenModeQ = src->Texture.Unit[i].GenModeQ;      dst->Texture.Unit[i]._GenBitS = src->Texture.Unit[i]._GenBitS;      dst->Texture.Unit[i]._GenBitT = src->Texture.Unit[i]._GenBitT;      dst->Texture.Unit[i]._GenBitR = src->Texture.Unit[i]._GenBitR;      dst->Texture.Unit[i]._GenBitQ = src->Texture.Unit[i]._GenBitQ;      dst->Texture.Unit[i]._GenFlags = src->Texture.Unit[i]._GenFlags;      COPY_4V(dst->Texture.Unit[i].ObjectPlaneS, src->Texture.Unit[i].ObjectPlaneS);      COPY_4V(dst->Texture.Unit[i].ObjectPlaneT, src->Texture.Unit[i].ObjectPlaneT);      COPY_4V(dst->Texture.Unit[i].ObjectPlaneR, src->Texture.Unit[i].ObjectPlaneR);      COPY_4V(dst->Texture.Unit[i].ObjectPlaneQ, src->Texture.Unit[i].ObjectPlaneQ);      COPY_4V(dst->Texture.Unit[i].EyePlaneS, src->Texture.Unit[i].EyePlaneS);      COPY_4V(dst->Texture.Unit[i].EyePlaneT, src->Texture.Unit[i].EyePlaneT);      COPY_4V(dst->Texture.Unit[i].EyePlaneR, src->Texture.Unit[i].EyePlaneR);      COPY_4V(dst->Texture.Unit[i].EyePlaneQ, src->Texture.Unit[i].EyePlaneQ);      dst->Texture.Unit[i].LodBias = src->Texture.Unit[i].LodBias;      /* GL_EXT_texture_env_combine */      dst->Texture.Unit[i].Combine.ModeRGB = src->Texture.Unit[i].Combine.ModeRGB;      dst->Texture.Unit[i].Combine.ModeA = src->Texture.Unit[i].Combine.ModeA;      COPY_3V(dst->Texture.Unit[i].Combine.SourceRGB, src->Texture.Unit[i].Combine.SourceRGB);      COPY_3V(dst->Texture.Unit[i].Combine.SourceA, src->Texture.Unit[i].Combine.SourceA);      COPY_3V(dst->Texture.Unit[i].Combine.OperandRGB, src->Texture.Unit[i].Combine.OperandRGB);      COPY_3V(dst->Texture.Unit[i].Combine.OperandA, src->Texture.Unit[i].Combine.OperandA);      dst->Texture.Unit[i].Combine.ScaleShiftRGB = src->Texture.Unit[i].Combine.ScaleShiftRGB;      dst->Texture.Unit[i].Combine.ScaleShiftA = src->Texture.Unit[i].Combine.ScaleShiftA;      /* copy texture object bindings, not contents of texture objects */      _mesa_lock_context_textures(dst);      _mesa_reference_texobj(&dst->Texture.Unit[i].Current1D,                             src->Texture.Unit[i].Current1D);      _mesa_reference_texobj(&dst->Texture.Unit[i].Current2D,                             src->Texture.Unit[i].Current2D);      _mesa_reference_texobj(&dst->Texture.Unit[i].Current3D,                             src->Texture.Unit[i].Current3D);      _mesa_reference_texobj(&dst->Texture.Unit[i].CurrentCubeMap,                             src->Texture.Unit[i].CurrentCubeMap);      _mesa_reference_texobj(&dst->Texture.Unit[i].CurrentRect,                             src->Texture.Unit[i].CurrentRect);      _mesa_reference_texobj(&dst->Texture.Unit[i].Current1DArray,                             src->Texture.Unit[i].Current1DArray);      _mesa_reference_texobj(&dst->Texture.Unit[i].Current2DArray,                             src->Texture.Unit[i].Current2DArray);      _mesa_unlock_context_textures(dst);   }}/* * For debugging */void_mesa_print_texunit_state( GLcontext *ctx, GLuint unit ){   const struct gl_texture_unit *texUnit = ctx->Texture.Unit + unit;   _mesa_printf("Texture Unit %d\n", unit);   _mesa_printf("  GL_TEXTURE_ENV_MODE = %s\n", _mesa_lookup_enum_by_nr(texUnit->EnvMode));   _mesa_printf("  GL_COMBINE_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.ModeRGB));   _mesa_printf("  GL_COMBINE_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.ModeA));   _mesa_printf("  GL_SOURCE0_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceRGB[0]));   _mesa_printf("  GL_SOURCE1_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceRGB[1]));   _mesa_printf("  GL_SOURCE2_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceRGB[2]));   _mesa_printf("  GL_SOURCE0_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceA[0]));   _mesa_printf("  GL_SOURCE1_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceA[1]));   _mesa_printf("  GL_SOURCE2_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceA[2]));   _mesa_printf("  GL_OPERAND0_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandRGB[0]));   _mesa_printf("  GL_OPERAND1_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandRGB[1]));   _mesa_printf("  GL_OPERAND2_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandRGB[2]));   _mesa_printf("  GL_OPERAND0_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandA[0]));   _mesa_printf("  GL_OPERAND1_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandA[1]));   _mesa_printf("  GL_OPERAND2_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandA[2]));   _mesa_printf("  GL_RGB_SCALE = %d\n", 1 << texUnit->Combine.ScaleShiftRGB);   _mesa_printf("  GL_ALPHA_SCALE = %d\n", 1 << texUnit->Combine.ScaleShiftA);   _mesa_printf("  GL_TEXTURE_ENV_COLOR = (%f, %f, %f, %f)\n", texUnit->EnvColor[0], texUnit->EnvColor[1], texUnit->EnvColor[2], texUnit->EnvColor[3]);}/**********************************************************************//*                       Texture Environment                          *//**********************************************************************//** * Convert "classic" texture environment to ARB_texture_env_combine style * environments. *  * \param state  texture_env_combine state vector to be filled-in. * \param mode   Classic texture environment mode (i.e., \c GL_REPLACE, *               \c GL_BLEND, \c GL_DECAL, etc.). * \param texBaseFormat  Base format of the texture associated with the *               texture unit. */static voidcalculate_derived_texenv( struct gl_tex_env_combine_state *state,			  GLenum mode, GLenum texBaseFormat ){   GLenum mode_rgb;   GLenum mode_a;   *state = default_combine_state;   switch (texBaseFormat) {   case GL_ALPHA:      state->SourceRGB[0] = GL_PREVIOUS;      break;   case GL_LUMINANCE_ALPHA:   case GL_INTENSITY:   case GL_RGBA:      break;   case GL_LUMINANCE:   case GL_RGB:   case GL_YCBCR_MESA:      state->SourceA[0] = GL_PREVIOUS;      break;         default:      _mesa_problem(NULL, "Invalid texBaseFormat in calculate_derived_texenv");      return;   }   if (mode == GL_REPLACE_EXT)      mode = GL_REPLACE;   switch (mode) {   case GL_REPLACE:   case GL_MODULATE:      mode_rgb = (texBaseFormat == GL_ALPHA) ? GL_REPLACE : mode;      mode_a   = mode;      break;      case GL_DECAL:      mode_rgb = GL_INTERPOLATE;      mode_a   = GL_REPLACE;      state->SourceA[0] = GL_PREVIOUS;      /* Having alpha / luminance / intensity textures replace using the       * incoming fragment color matches the definition in NV_texture_shader.       * The 1.5 spec simply marks these as "undefined".       */      switch (texBaseFormat) {      case GL_ALPHA:      case GL_LUMINANCE:      case GL_LUMINANCE_ALPHA:      case GL_INTENSITY:	 state->SourceRGB[0] = GL_PREVIOUS;	 break;      case GL_RGB:      case GL_YCBCR_MESA:	 mode_rgb = GL_REPLACE;	 break;      case GL_RGBA:	 state->SourceRGB[2] = GL_TEXTURE;	 break;      }      break;   case GL_BLEND:      mode_rgb = GL_INTERPOLATE;      mode_a   = GL_MODULATE;      switch (texBaseFormat) {      case GL_ALPHA:	 mode_rgb = GL_REPLACE;	 break;      case GL_INTENSITY:	 mode_a = GL_INTERPOLATE;	 state->SourceA[0] = GL_CONSTANT;	 state->OperandA[2] = GL_SRC_ALPHA;	 /* FALLTHROUGH */      case GL_LUMINANCE:      case GL_RGB:      case GL_LUMINANCE_ALPHA:      case GL_RGBA:      case GL_YCBCR_MESA:	 state->SourceRGB[2] = GL_TEXTURE;	 state->SourceA[2]   = GL_TEXTURE;	 state->SourceRGB[0] = GL_CONSTANT;	 state->OperandRGB[2] = GL_SRC_COLOR;	 break;      }      break;   case GL_ADD:      mode_rgb = (texBaseFormat == GL_ALPHA) ? GL_REPLACE : GL_ADD;      mode_a   = (texBaseFormat == GL_INTENSITY) ? GL_ADD : GL_MODULATE;      break;   default:      _mesa_problem(NULL,                    "Invalid texture env mode in calculate_derived_texenv");      return;   }      state->ModeRGB = (state->SourceRGB[0] != GL_PREVIOUS)       ? mode_rgb : GL_REPLACE;   state->ModeA   = (state->SourceA[0]   != GL_PREVIOUS)       ? mode_a   : GL_REPLACE;}void GLAPIENTRY_mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param ){   GLuint maxUnit;   GET_CURRENT_CONTEXT(ctx);   struct gl_texture_unit *texUnit;   ASSERT_OUTSIDE_BEGIN_END(ctx);   maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)      ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits;   if (ctx->Texture.CurrentUnit >= maxUnit) {      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexEnvfv(current unit)");      return;   }   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];#define TE_ERROR(errCode, msg, value)				\   _mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value));   if (target == GL_TEXTURE_ENV) {      switch (pname) {      case GL_TEXTURE_ENV_MODE:         {            GLenum mode = (GLenum) (GLint) *param;            if (mode == GL_REPLACE_EXT)               mode = GL_REPLACE;	    if (texUnit->EnvMode == mode)	       return;            if (mode == GL_MODULATE ||                mode == GL_BLEND ||                mode == GL_DECAL ||                mode == GL_REPLACE ||                (mode == GL_ADD && ctx->Extensions.EXT_texture_env_add) ||                (mode == GL_COMBINE &&                 (ctx->Extensions.EXT_texture_env_combine ||                  ctx->Extensions.ARB_texture_env_combine))) {               /* legal */               FLUSH_VERTICES(ctx, _NEW_TEXTURE);               texUnit->EnvMode = mode;            }            else {               TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);               return;            }         }         break;      case GL_TEXTURE_ENV_COLOR:         {            GLfloat tmp[4];            tmp[0] = CLAMP( param[0], 0.0F, 1.0F );            tmp[1] = CLAMP( param[1], 0.0F, 1.0F );            tmp[2] = CLAMP( param[2], 0.0F, 1.0F );            tmp[3] = CLAMP( param[3], 0.0F, 1.0F );            if (TEST_EQ_4V(tmp, texUnit->EnvColor))               return;            FLUSH_VERTICES(ctx, _NEW_TEXTURE);            COPY_4FV(texUnit->EnvColor, tmp);         }         break;      case GL_COMBINE_RGB:	 if (ctx->Extensions.EXT_texture_env_combine ||             ctx->Extensions.ARB_texture_env_combine) {	    const GLenum mode = (GLenum) (GLint) *param;	    if (texUnit->Combine.ModeRGB == mode)	       return;	    switch (mode) {	    case GL_REPLACE:	    case GL_MODULATE:	    case GL_ADD:	    case GL_ADD_SIGNED:	    case GL_INTERPOLATE:               /* OK */	       break;            case GL_SUBTRACT:               if (!ctx->Extensions.ARB_texture_env_combine) {                  TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);                  return;               }               break;	    case GL_DOT3_RGB_EXT:	    case GL_DOT3_RGBA_EXT:	       if (!ctx->Extensions.EXT_texture_env_dot3) {                  TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);		  return;	       }	       break;	    case GL_DOT3_RGB:	    case GL_DOT3_RGBA:

⌨️ 快捷键说明

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