📄 savagestate.c
字号:
/* * 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 + -