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

📄 savagestate.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. * Copyright 2001-2003 S3 Graphics, Inc. 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, sub license, * 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 NON-INFRINGEMENT. IN NO EVENT SHALL * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS 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. */#include <stdio.h>#include "mtypes.h"#include "enums.h"#include "macros.h"#include "dd.h"#include "mm.h"#include "savagedd.h"#include "savagecontext.h"#include "savagestate.h"#include "savagetex.h"#include "savagetris.h"#include "savageioctl.h"#include "savage_bci.h"#include "swrast/swrast.h"#include "vbo/vbo.h"#include "tnl/tnl.h"#include "swrast_setup/swrast_setup.h"#include "xmlpool.h"/* Savage4, ProSavage[DDR], SuperSavage watermarks */#define S4_ZRLO 24#define S4_ZRHI 24#define S4_ZWLO 0#define S4_ZWHI 0#define S4_DRLO 0#define S4_DRHI 0#define S4_DWLO 0#define S4_DWHI 0#define S4_TR   15/* Savage3D/MX/IX watermarks */#define S3D_ZRLO 8#define S3D_ZRHI 24#define S3D_ZWLO 0#define S3D_ZWHI 24#define S3D_DRLO 0#define S3D_DRHI 0#define S3D_DWLO 0#define S3D_DWHI 0#define S3D_TR   15static void savageBlendFunc_s4(GLcontext *);static void savageBlendFunc_s3d(GLcontext *);static INLINE GLuint savagePackColor(GLuint format,                                          GLubyte r, GLubyte g,                                          GLubyte b, GLubyte a){    switch (format) {        case DV_PF_8888:            return SAVAGEPACKCOLOR8888(r,g,b,a);        case DV_PF_565:            return SAVAGEPACKCOLOR565(r,g,b);        default:                        return 0;    }}static void savageDDAlphaFunc_s4(GLcontext *ctx, GLenum func, GLfloat ref){    savageBlendFunc_s4(ctx);}static void savageDDAlphaFunc_s3d(GLcontext *ctx, GLenum func, GLfloat ref){    savageBlendFunc_s3d(ctx);}static void savageDDBlendEquationSeparate(GLcontext *ctx,					  GLenum modeRGB, GLenum modeA){    assert( modeRGB == modeA );    /* BlendEquation sets ColorLogicOpEnabled in an unexpected      * manner.       */    FALLBACK( ctx, SAVAGE_FALLBACK_LOGICOP,	      (ctx->Color.ColorLogicOpEnabled && 	       ctx->Color.LogicOp != GL_COPY));   /* Can only do blend addition, not min, max, subtract, etc. */   FALLBACK( ctx, SAVAGE_FALLBACK_BLEND_EQ,	     modeRGB != GL_FUNC_ADD);}static void savageBlendFunc_s4(GLcontext *ctx){    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);    u_int32_t drawLocalCtrl = imesa->regs.s4.drawLocalCtrl.ui;    u_int32_t drawCtrl0 = imesa->regs.s4.drawCtrl0.ui;    u_int32_t drawCtrl1 = imesa->regs.s4.drawCtrl1.ui;    /* set up draw control register (including blending, alpha     * test, and shading model)     */    imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites = GL_FALSE;    /*     * blend modes     */    if(ctx->Color.BlendEnabled){        switch (ctx->Color.BlendDstRGB)        {            case GL_ZERO:                imesa->regs.s4.drawLocalCtrl.ni.dstAlphaMode = DAM_Zero;                break;            case GL_ONE:                imesa->regs.s4.drawLocalCtrl.ni.dstAlphaMode = DAM_One;                imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_SRC_COLOR:                imesa->regs.s4.drawLocalCtrl.ni.dstAlphaMode = DAM_SrcClr;                imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_ONE_MINUS_SRC_COLOR:                imesa->regs.s4.drawLocalCtrl.ni.dstAlphaMode = DAM_1SrcClr;                imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_SRC_ALPHA:                imesa->regs.s4.drawLocalCtrl.ni.dstAlphaMode = DAM_SrcAlpha;                imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_ONE_MINUS_SRC_ALPHA:                imesa->regs.s4.drawLocalCtrl.ni.dstAlphaMode = DAM_1SrcAlpha;                imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_DST_ALPHA:                if (imesa->glCtx->Visual.alphaBits == 0)                {                    imesa->regs.s4.drawLocalCtrl.ni.dstAlphaMode = DAM_One;                }                else                {                    imesa->regs.s4.drawLocalCtrl.ni.dstAlphaMode= DAM_DstAlpha;                }                imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_ONE_MINUS_DST_ALPHA:                if (imesa->glCtx->Visual.alphaBits == 0)                {                    imesa->regs.s4.drawLocalCtrl.ni.dstAlphaMode = DAM_Zero;                }                else                {                    imesa->regs.s4.drawLocalCtrl.ni.dstAlphaMode=DAM_1DstAlpha;                    imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites= GL_TRUE;                }                break;        }        switch (ctx->Color.BlendSrcRGB)        {            case GL_ZERO:                imesa->regs.s4.drawLocalCtrl.ni.srcAlphaMode = SAM_Zero;                break;            case GL_ONE:                imesa->regs.s4.drawLocalCtrl.ni.srcAlphaMode = SAM_One;                break;            case GL_DST_COLOR:                imesa->regs.s4.drawLocalCtrl.ni.srcAlphaMode = SAM_DstClr;                imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_ONE_MINUS_DST_COLOR:                imesa->regs.s4.drawLocalCtrl.ni.srcAlphaMode = SAM_1DstClr;                imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_SRC_ALPHA:                imesa->regs.s4.drawLocalCtrl.ni.srcAlphaMode = SAM_SrcAlpha;                break;            case GL_ONE_MINUS_SRC_ALPHA:                imesa->regs.s4.drawLocalCtrl.ni.srcAlphaMode = SAM_1SrcAlpha;                break;            case GL_DST_ALPHA:                if (imesa->glCtx->Visual.alphaBits == 0)                {                    imesa->regs.s4.drawLocalCtrl.ni.srcAlphaMode = SAM_One;                }                else                {                    imesa->regs.s4.drawLocalCtrl.ni.srcAlphaMode= SAM_DstAlpha;                    imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites= GL_TRUE;                }                break;            case GL_ONE_MINUS_DST_ALPHA:                if (imesa->glCtx->Visual.alphaBits == 0)                          {                    imesa->regs.s4.drawLocalCtrl.ni.srcAlphaMode = SAM_Zero;                }                else                {                    imesa->regs.s4.drawLocalCtrl.ni.srcAlphaMode=SAM_1DstAlpha;                    imesa->regs.s4.drawLocalCtrl.ni.flushPdDestWrites= GL_TRUE;                }                break;        }    }    else    {        imesa->regs.s4.drawLocalCtrl.ni.dstAlphaMode = DAM_Zero;        imesa->regs.s4.drawLocalCtrl.ni.srcAlphaMode = SAM_One;    }    /* alpha test*/    if(ctx->Color.AlphaEnabled)     {        ACmpFunc a;	GLubyte alphaRef;	CLAMPED_FLOAT_TO_UBYTE(alphaRef,ctx->Color.AlphaRef);                 switch(ctx->Color.AlphaFunc)  { 	case GL_NEVER: a = CF_Never; break;	case GL_ALWAYS: a = CF_Always; break;	case GL_LESS: a = CF_Less; break; 	case GL_LEQUAL: a = CF_LessEqual; break;	case GL_EQUAL: a = CF_Equal; break;	case GL_GREATER: a = CF_Greater; break;	case GL_GEQUAL: a = CF_GreaterEqual; break;	case GL_NOTEQUAL: a = CF_NotEqual; break;	default:return;        }         	imesa->regs.s4.drawCtrl1.ni.alphaTestEn = GL_TRUE;	imesa->regs.s4.drawCtrl1.ni.alphaTestCmpFunc = a;	imesa->regs.s4.drawCtrl0.ni.alphaRefVal = alphaRef;    }    else    {	imesa->regs.s4.drawCtrl1.ni.alphaTestEn      = GL_FALSE;    }    /* Set/Reset Z-after-alpha*/    imesa->regs.s4.drawLocalCtrl.ni.wrZafterAlphaTst =	imesa->regs.s4.drawCtrl1.ni.alphaTestEn;    /*imesa->regs.s4.drawLocalCtrl.ni.zUpdateEn =        ~drawLocalCtrl.ni.wrZafterAlphaTst;*/    if (drawLocalCtrl != imesa->regs.s4.drawLocalCtrl.ui)	imesa->dirty |= SAVAGE_UPLOAD_LOCAL;    if (drawCtrl0 != imesa->regs.s4.drawCtrl0.ui ||	drawCtrl1 != imesa->regs.s4.drawCtrl1.ui)	imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;}static void savageBlendFunc_s3d(GLcontext *ctx){    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);    u_int32_t drawCtrl = imesa->regs.s3d.drawCtrl.ui;    u_int32_t zBufCtrl = imesa->regs.s3d.zBufCtrl.ui;    /* set up draw control register (including blending, alpha     * test, dithering, and shading model)     */    imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = 0;    /*     * blend modes     */    if(ctx->Color.BlendEnabled){        switch (ctx->Color.BlendDstRGB)        {            case GL_ZERO:                imesa->regs.s3d.drawCtrl.ni.dstAlphaMode = DAM_Zero;                break;            case GL_ONE:                imesa->regs.s3d.drawCtrl.ni.dstAlphaMode = DAM_One;                imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_SRC_COLOR:                imesa->regs.s3d.drawCtrl.ni.dstAlphaMode = DAM_SrcClr;                imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_ONE_MINUS_SRC_COLOR:                imesa->regs.s3d.drawCtrl.ni.dstAlphaMode = DAM_1SrcClr;                imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_SRC_ALPHA:                imesa->regs.s3d.drawCtrl.ni.dstAlphaMode = DAM_SrcAlpha;                imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_ONE_MINUS_SRC_ALPHA:                imesa->regs.s3d.drawCtrl.ni.dstAlphaMode = DAM_1SrcAlpha;                imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_DST_ALPHA:                if (imesa->glCtx->Visual.alphaBits == 0)                {                    imesa->regs.s3d.drawCtrl.ni.dstAlphaMode = DAM_One;                }                else                {                    imesa->regs.s3d.drawCtrl.ni.dstAlphaMode = DAM_DstAlpha;                }                imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_ONE_MINUS_DST_ALPHA:                if (imesa->glCtx->Visual.alphaBits == 0)                {                    imesa->regs.s3d.drawCtrl.ni.dstAlphaMode = DAM_Zero;                }                else                {                    imesa->regs.s3d.drawCtrl.ni.dstAlphaMode = DAM_1DstAlpha;                    imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;                }                break;        }        switch (ctx->Color.BlendSrcRGB)        {            case GL_ZERO:                imesa->regs.s3d.drawCtrl.ni.srcAlphaMode = SAM_Zero;                break;            case GL_ONE:                imesa->regs.s3d.drawCtrl.ni.srcAlphaMode = SAM_One;                break;            case GL_DST_COLOR:                imesa->regs.s3d.drawCtrl.ni.srcAlphaMode = SAM_DstClr;                imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_ONE_MINUS_DST_COLOR:                imesa->regs.s3d.drawCtrl.ni.srcAlphaMode = SAM_1DstClr;                imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;                break;            case GL_SRC_ALPHA:                imesa->regs.s3d.drawCtrl.ni.srcAlphaMode = SAM_SrcAlpha;                break;            case GL_ONE_MINUS_SRC_ALPHA:                imesa->regs.s3d.drawCtrl.ni.srcAlphaMode = SAM_1SrcAlpha;                break;            case GL_DST_ALPHA:                if (imesa->glCtx->Visual.alphaBits == 0)                {                    imesa->regs.s3d.drawCtrl.ni.srcAlphaMode = SAM_One;                }                else                {                    imesa->regs.s3d.drawCtrl.ni.srcAlphaMode = SAM_DstAlpha;                    imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;                }                break;            case GL_ONE_MINUS_DST_ALPHA:                if (imesa->glCtx->Visual.alphaBits == 0)                          {                    imesa->regs.s3d.drawCtrl.ni.srcAlphaMode = SAM_Zero;                }                else                {                    imesa->regs.s3d.drawCtrl.ni.srcAlphaMode = SAM_1DstAlpha;                    imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;                }                break;        }    }    else    {        imesa->regs.s3d.drawCtrl.ni.dstAlphaMode = DAM_Zero;        imesa->regs.s3d.drawCtrl.ni.srcAlphaMode = SAM_One;    }    /* alpha test*/    if(ctx->Color.AlphaEnabled)     {        ACmpFunc a;	GLubyte alphaRef;

⌨️ 快捷键说明

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