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

📄 tdfx_texstate.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
/* -*- 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 + -