/*---------------------------------------------------------------------------* Project: Dolphin GD library File: GDTev.c Copyright 2001 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Log: GDTev.c,v $ Revision 1.2 02/20/2006 04:24:39 mitu changed include path from dolphin/ to revolution/. Revision 1.1.1.1 2005/05/12 02:15:49 yasuh-to transitioned from the Dolphin source tree 5 11/07/01 6:44p Hirose Fixed GDSetTevColorS10 negative value bug. 4 9/28/01 4:37p Hirose Fixed GDSetTevColorS10 and GDSetTevKColor as well. 3 9/28/01 3:19a Hirose Fixed a bug in GDSetTevColor. 2 9/21/01 1:46p Carl Changed order of args for GDSetKonstantSel. 1 9/12/01 1:52p Carl Initial revision of GD: Graphics Display List Library. $NoKeywords: $ *---------------------------------------------------------------------------*/ #include #include /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ // Name: GDSetTevOp // // Description: Sets up various TEV configurations in a simplified way. // Note: the ras & tex swap parameters are set to TEV_SWAP0. // // Arguments: stage which TEV stage will be set // mode which simplified TEV mode // // Returns: none // /*---------------------------------------------------------------------------*/ void GDSetTevOp(GXTevStageID stage, GXTevMode mode) { GXTevColorArg carg = GX_CC_RASC; GXTevAlphaArg aarg = GX_CA_RASA; if (stage != GX_TEVSTAGE0) { carg = GX_CC_CPREV; aarg = GX_CA_APREV; } switch (mode) { case GX_MODULATE: GDSetTevColorCalc( stage, GX_CC_ZERO, GX_CC_TEXC, carg, GX_CC_ZERO, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV ); GDSetTevAlphaCalcAndSwap( stage, GX_CA_ZERO, GX_CA_TEXA, aarg, GX_CA_ZERO, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV, GX_TEV_SWAP0, GX_TEV_SWAP0 ); break; case GX_DECAL: GDSetTevColorCalc( stage, carg, GX_CC_TEXC, GX_CC_TEXA, GX_CC_ZERO, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV ); GDSetTevAlphaCalcAndSwap( stage, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, aarg, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV, GX_TEV_SWAP0, GX_TEV_SWAP0 ); break; case GX_BLEND: GDSetTevColorCalc( stage, carg, GX_CC_ONE, GX_CC_TEXC, GX_CC_ZERO, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV ); GDSetTevAlphaCalcAndSwap( stage, GX_CA_ZERO, GX_CA_TEXA, aarg, GX_CA_ZERO, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV, GX_TEV_SWAP0, GX_TEV_SWAP0 ); break; case GX_REPLACE: GDSetTevColorCalc(stage, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV ); GDSetTevAlphaCalcAndSwap( stage, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV, GX_TEV_SWAP0, GX_TEV_SWAP0 ); break; case GX_PASSCLR: GDSetTevColorCalc( stage, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, carg, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV ); GDSetTevAlphaCalcAndSwap( stage, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, aarg, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV, GX_TEV_SWAP0, GX_TEV_SWAP0 ); break; default: ASSERTMSG(0, "GDSetTevOp: Invalid Tev Mode"); break; } } /*---------------------------------------------------------------------------*/ // Name: GDSetTevColorCalc // // Description: Sets up the RGB part of a TEV calculation // // Arguments: stage which TEV stage will be set // ... parameters to set, as indicated by name // // Returns: none // /*---------------------------------------------------------------------------*/ void GDSetTevColorCalc( GXTevStageID stage, GXTevColorArg a, GXTevColorArg b, GXTevColorArg c, GXTevColorArg d, GXTevOp op, GXTevBias bias, GXTevScale scale, GXBool clamp, GXTevRegID out_reg ) { if (op <= GX_TEV_SUB) { GDWriteBPCmd( TEV_COLOR_ENV( d, c, b, a, bias, (op & 1), clamp, scale, out_reg, TEV_COLOR_ENV_0_ID + 2 * (u32) stage )); } else { GDWriteBPCmd( TEV_COLOR_ENV( d, c, b, a, GX_MAX_TEVBIAS, (op&1), clamp, ((op>>1)&3), out_reg, TEV_COLOR_ENV_0_ID + 2 * (u32) stage )); } } /*---------------------------------------------------------------------------*/ // Name: GDSetTevAlphaCalcAndSwap // // Description: Sets up the alpha part of a TEV calculation, as well as // selecting the raster and texture color swap modes // // Arguments: stage which TEV stage will be set // ... parameters to set, as indicated by name // // Returns: none // /*---------------------------------------------------------------------------*/ void GDSetTevAlphaCalcAndSwap( GXTevStageID stage, GXTevAlphaArg a, GXTevAlphaArg b, GXTevAlphaArg c, GXTevAlphaArg d, GXTevOp op, GXTevBias bias, GXTevScale scale, GXBool clamp, GXTevRegID out_reg, GXTevSwapSel ras_sel, GXTevSwapSel tex_sel ) { if (op <= GX_TEV_SUB) { GDWriteBPCmd( TEV_ALPHA_ENV( ras_sel, tex_sel, d, c, b, a, bias, (op & 1), clamp, scale, out_reg, TEV_ALPHA_ENV_0_ID + 2 * (u32) stage )); } else { GDWriteBPCmd( TEV_ALPHA_ENV( ras_sel, tex_sel, d, c, b, a, GX_MAX_TEVBIAS, (op&1), clamp, ((op>>1)&3), out_reg, TEV_ALPHA_ENV_0_ID + 2 * (u32) stage )); } } /*---------------------------------------------------------------------------*/ // Name: GDSetTevColor // // Description: Set one of the dynamic TEV color registers. // This versions lets you input RGBA8 colors. // // Arguments: reg which dynamic TEV color register will be set // color RGBA8 color value to write to register // // Returns: none // /*---------------------------------------------------------------------------*/ void GDSetTevColor ( GXTevRegID reg, GXColor color ) { u32 regRA, regBG; regRA = TEV_REGISTERL( color.r, color.a, TEV_COLOR_REG, TEV_REGISTERL_0_ID + reg * 2 ); regBG = TEV_REGISTERH( color.b, color.g, TEV_COLOR_REG, TEV_REGISTERH_0_ID + reg * 2 ); GDWriteBPCmd( regRA ); GDWriteBPCmd( regBG ); // Due to color load delay bug, must put two more BP commands here... GDWriteBPCmd( regBG ); GDWriteBPCmd( regBG ); } /*---------------------------------------------------------------------------*/ // Name: GDSetTevColorS10 // // Description: Set one of the dynamic TEV color registers. // This versions lets you input RGBA10 colors. // // Arguments: reg which dynamic TEV color register will be set // color RGBA8 color value to write to register // // Returns: none // /*---------------------------------------------------------------------------*/ #define TEV_REGISTER_VAL_SIZE 11 #define TEV_REGISTER_VAL_MASK ((1<