📄 tdfx_texstate.c
字号:
/* -*- mode: c; c-basic-offset: 3 -*- * * Copyright 2000 VA Linux Systems Inc., Fremont, California. * * 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 (including the next * paragraph) 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 * VA LINUX SYSTEMS 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. *//* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_texstate.c,v 1.2 2002/02/22 21:45:04 dawes Exp $ *//* * New fixes: * Daniel Borca <dborca@users.sourceforge.net>, 19 Jul 2004 * * Original rewrite: * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000 * * Authors: * Gareth Hughes <gareth@valinux.com> * Brian Paul <brianp@valinux.com> * */#include "tdfx_state.h"#include "tdfx_tex.h"#include "tdfx_texman.h"#include "tdfx_texstate.h"/* ============================================================= * Texture *//* * These macros are used below when handling COMBINE_EXT. */#define TEXENV_OPERAND_INVERTED(operand) \ (((operand) == GL_ONE_MINUS_SRC_ALPHA) \ || ((operand) == GL_ONE_MINUS_SRC_COLOR))#define TEXENV_OPERAND_ALPHA(operand) \ (((operand) == GL_SRC_ALPHA) || ((operand) == GL_ONE_MINUS_SRC_ALPHA))#define TEXENV_SETUP_ARG_A(param, source, operand, iteratedAlpha) \ switch (source) { \ case GL_TEXTURE: \ param = GR_CMBX_LOCAL_TEXTURE_ALPHA; \ break; \ case GL_CONSTANT_EXT: \ param = GR_CMBX_TMU_CALPHA; \ break; \ case GL_PRIMARY_COLOR_EXT: \ param = GR_CMBX_ITALPHA; \ break; \ case GL_PREVIOUS_EXT: \ param = iteratedAlpha; \ break; \ default: \ /* \ * This is here just to keep from getting \ * compiler warnings. \ */ \ param = GR_CMBX_ZERO; \ break; \ }#define TEXENV_SETUP_ARG_RGB(param, source, operand, iteratedColor, iteratedAlpha) \ if (!TEXENV_OPERAND_ALPHA(operand)) { \ switch (source) { \ case GL_TEXTURE: \ param = GR_CMBX_LOCAL_TEXTURE_RGB; \ break; \ case GL_CONSTANT_EXT: \ param = GR_CMBX_TMU_CCOLOR; \ break; \ case GL_PRIMARY_COLOR_EXT: \ param = GR_CMBX_ITRGB; \ break; \ case GL_PREVIOUS_EXT: \ param = iteratedColor; \ break; \ default: \ /* \ * This is here just to keep from getting \ * compiler warnings. \ */ \ param = GR_CMBX_ZERO; \ break; \ } \ } else { \ switch (source) { \ case GL_TEXTURE: \ param = GR_CMBX_LOCAL_TEXTURE_ALPHA; \ break; \ case GL_CONSTANT_EXT: \ param = GR_CMBX_TMU_CALPHA; \ break; \ case GL_PRIMARY_COLOR_EXT: \ param = GR_CMBX_ITALPHA; \ break; \ case GL_PREVIOUS_EXT: \ param = iteratedAlpha; \ break; \ default: \ /* \ * This is here just to keep from getting \ * compiler warnings. \ */ \ param = GR_CMBX_ZERO; \ break; \ } \ }#define TEXENV_SETUP_MODE_RGB(param, operand) \ switch (operand) { \ case GL_SRC_COLOR: \ case GL_SRC_ALPHA: \ param = GR_FUNC_MODE_X; \ break; \ case GL_ONE_MINUS_SRC_ALPHA: \ case GL_ONE_MINUS_SRC_COLOR: \ param = GR_FUNC_MODE_ONE_MINUS_X; \ break; \ default: \ param = GR_FUNC_MODE_ZERO; \ break; \ }#define TEXENV_SETUP_MODE_A(param, operand) \ switch (operand) { \ case GL_SRC_ALPHA: \ param = GR_FUNC_MODE_X; \ break; \ case GL_ONE_MINUS_SRC_ALPHA: \ param = GR_FUNC_MODE_ONE_MINUS_X; \ break; \ default: \ param = GR_FUNC_MODE_ZERO; \ break; \ }/* * Setup a texture environment on Voodoo5. * Return GL_TRUE for success, GL_FALSE for failure. * If we fail, we'll have to use software rendering. */static GLbooleanSetupTexEnvNapalm(GLcontext *ctx, GLboolean useIteratedRGBA, const struct gl_texture_unit *texUnit, GLenum baseFormat, struct tdfx_texcombine_ext *env){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); GrTCCUColor_t incomingRGB, incomingAlpha; const GLenum envMode = texUnit->EnvMode; if (useIteratedRGBA) { incomingRGB = GR_CMBX_ITRGB; incomingAlpha = GR_CMBX_ITALPHA; } else { incomingRGB = GR_CMBX_OTHER_TEXTURE_RGB; incomingAlpha = GR_CMBX_OTHER_TEXTURE_ALPHA; } /* invariant: */ env->Color.Shift = 0; env->Color.Invert = FXFALSE; env->Alpha.Shift = 0; env->Alpha.Invert = FXFALSE; switch (envMode) { case GL_REPLACE: /* -- Setup RGB combiner */ if (baseFormat == GL_ALPHA) { /* Rv = Rf */ env->Color.SourceA = incomingRGB; } else { /* Rv = Rt */ env->Color.SourceA = GR_CMBX_LOCAL_TEXTURE_RGB; } env->Color.ModeA = GR_FUNC_MODE_X; env->Color.SourceB = GR_CMBX_ZERO; env->Color.ModeB = GR_FUNC_MODE_ZERO; env->Color.SourceC = GR_CMBX_ZERO; env->Color.InvertC = FXTRUE; env->Color.SourceD = GR_CMBX_ZERO; env->Color.InvertD = FXFALSE; /* -- Setup Alpha combiner */ if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) { /* Av = Af */ env->Alpha.SourceD = incomingAlpha; } else { /* Av = At */ env->Alpha.SourceD = GR_CMBX_LOCAL_TEXTURE_ALPHA; } env->Alpha.SourceA = GR_CMBX_ITALPHA; env->Alpha.ModeA = GR_FUNC_MODE_ZERO; env->Alpha.SourceB = GR_CMBX_ITALPHA; env->Alpha.ModeB = GR_FUNC_MODE_ZERO; env->Alpha.SourceC = GR_CMBX_ZERO; env->Alpha.InvertC = FXFALSE; env->Alpha.InvertD = FXFALSE; break; case GL_MODULATE: /* -- Setup RGB combiner */ if (baseFormat == GL_ALPHA) { /* Rv = Rf */ env->Color.SourceC = GR_CMBX_ZERO; env->Color.InvertC = FXTRUE; } else { /* Result = Frag * Tex */ env->Color.SourceC = GR_CMBX_LOCAL_TEXTURE_RGB; env->Color.InvertC = FXFALSE; } env->Color.SourceA = incomingRGB; env->Color.ModeA = GR_FUNC_MODE_X; env->Color.SourceB = GR_CMBX_ZERO; env->Color.ModeB = GR_FUNC_MODE_ZERO; env->Color.SourceD = GR_CMBX_ZERO; env->Color.InvertD = FXFALSE; /* -- Setup Alpha combiner */ if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) { /* Av = Af */ env->Alpha.SourceA = incomingAlpha; env->Alpha.SourceC = GR_CMBX_ZERO; env->Alpha.InvertC = FXTRUE; } else { /* Av = Af * At */ env->Alpha.SourceA = GR_CMBX_LOCAL_TEXTURE_ALPHA; env->Alpha.SourceC = incomingAlpha; env->Alpha.InvertC = FXFALSE; } env->Alpha.ModeA = GR_FUNC_MODE_X; env->Alpha.SourceB = GR_CMBX_ITALPHA; env->Alpha.ModeB = GR_FUNC_MODE_ZERO; env->Alpha.SourceD = GR_CMBX_ZERO; env->Alpha.InvertD = FXFALSE; break; case GL_DECAL: /* -- Setup RGB combiner */ if (baseFormat == GL_RGB) { /* Rv = Rt */ env->Color.SourceB = GR_CMBX_ZERO; env->Color.ModeB = GR_FUNC_MODE_X; env->Color.SourceC = GR_CMBX_ZERO; env->Color.InvertC = FXTRUE; env->Color.SourceD = GR_CMBX_ZERO; env->Color.InvertD = FXFALSE; } else { /* Rv = Rf * (1 - At) + Rt * At */ env->Color.SourceB = incomingRGB; env->Color.ModeB = GR_FUNC_MODE_NEGATIVE_X; env->Color.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA; env->Color.InvertC = FXFALSE; env->Color.SourceD = GR_CMBX_B; env->Color.InvertD = FXFALSE; } env->Color.SourceA = GR_CMBX_LOCAL_TEXTURE_RGB; env->Color.ModeA = GR_FUNC_MODE_X; /* -- Setup Alpha combiner */ /* Av = Af */ env->Alpha.SourceA = incomingAlpha; env->Alpha.ModeA = GR_FUNC_MODE_X; env->Alpha.SourceB = GR_CMBX_ITALPHA; env->Alpha.ModeB = GR_FUNC_MODE_ZERO; env->Alpha.SourceC = GR_CMBX_ZERO; env->Alpha.InvertC = FXTRUE; env->Alpha.SourceD = GR_CMBX_ZERO; env->Alpha.InvertD = FXFALSE; break; case GL_BLEND: /* -- Setup RGB combiner */ if (baseFormat == GL_ALPHA) { /* Rv = Rf */ env->Color.SourceA = incomingRGB; env->Color.ModeA = GR_FUNC_MODE_X; env->Color.SourceB = GR_CMBX_ZERO; env->Color.ModeB = GR_FUNC_MODE_ZERO;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -