Path: blob/master/libmupen64plus/mupen64plus-video-rice/src/OGLCombinerTNT2.cpp
2 views
/*1Copyright (C) 2003 Rice196423This program is free software; you can redistribute it and/or4modify it under the terms of the GNU General Public License5as published by the Free Software Foundation; either version 26of the License, or (at your option) any later version.78This program is distributed in the hope that it will be useful,9but WITHOUT ANY WARRANTY; without even the implied warranty of10MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the11GNU General Public License for more details.1213You should have received a copy of the GNU General Public License14along with this program; if not, write to the Free Software15Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.16*/1718#include "OGLExtensions.h"1920#include "OGLCombinerTNT2.h"21#include "OGLRender.h"22#include "OGLGraphicsContext.h"23#include "OGLTexture.h"2425//========================================================================26COGLColorCombinerTNT2::COGLColorCombinerTNT2(CRender *pRender)27:COGLColorCombiner4(pRender)28{29m_bTNT2Supported=false;30delete m_pDecodedMux;31m_pDecodedMux = new COGLDecodedMux;32m_ppDecodedMux = &m_pDecodedMux;33}343536bool COGLColorCombinerTNT2::Initialize(void)37{38m_bTNT2Supported = false;3940if( COGLColorCombiner4::Initialize() )41{42m_bSupportMultiTexture = true;43COGLGraphicsContext *pcontext = (COGLGraphicsContext *)(CGraphicsContext::g_pGraphicsContext);44if( pcontext->IsExtensionSupported("GL_NV_texture_env_combine4") )45{46m_bTNT2Supported = true;47}48else49{50DebugMessage(M64MSG_ERROR, "Your video card does not support OpenGL TNT2 extension combiner, you can only use the OpenGL Ext combiner functions");51}52return true;53}54return false;55}5657//========================================================================5859void COGLColorCombinerTNT2::InitCombinerCycle12(void)60{61if( !m_bOGLExtCombinerSupported ) { COGLColorCombiner4::InitCombinerCycle12(); return;}6263#ifdef DEBUGGER64if( debuggerDropCombiners )65{66m_vCompiledTNTSettings.clear();67m_dwLastMux0 = m_dwLastMux1 = 0;68debuggerDropCombiners = false;69}70#endif7172m_pOGLRender->EnableMultiTexture();7374bool combinerIsChanged = false;7576if( m_pDecodedMux->m_dwMux0 != m_dwLastMux0 || m_pDecodedMux->m_dwMux1 != m_dwLastMux1 || m_lastIndex < 0 )77{78combinerIsChanged = true;79m_lastIndex = CNvTNTCombiner::FindCompiledMux();80if( m_lastIndex < 0 ) // Can not found81{82m_lastIndex = CNvTNTCombiner::ParseDecodedMux();83}84m_dwLastMux0 = m_pDecodedMux->m_dwMux0;85m_dwLastMux1 = m_pDecodedMux->m_dwMux1;86}8788m_pOGLRender->SetAllTexelRepeatFlag();8990if( m_bCycleChanged || combinerIsChanged || gRDP.texturesAreReloaded || gRDP.colorsAreReloaded )91{92gRDP.texturesAreReloaded = false;9394if( m_bCycleChanged || combinerIsChanged )95{96GenerateCombinerSettingConstants(m_lastIndex);97GenerateCombinerSetting(m_lastIndex);98}99else if( gRDP.colorsAreReloaded )100{101GenerateCombinerSettingConstants(m_lastIndex);102}103104gRDP.colorsAreReloaded = false;105}106}107108const char* COGLColorCombinerTNT2::GetOpStr(GLenum op)109{110switch( op )111{112case GL_ADD:113return "MOD";114default:115return "ADD_SIGNED";116}117}118119120#ifdef DEBUGGER121void COGLColorCombinerTNT2::DisplaySimpleMuxString(void)122{123COGLColorCombiner::DisplaySimpleMuxString();124CNvTNTCombiner::DisplaySimpleMuxString();125}126#endif127128//========================================================================129130GLint COGLColorCombinerTNT2::RGBArgsMap[] =131{132GL_ZERO, //MUX_0133GL_ZERO, //MUX_1134GL_PREVIOUS_EXT, //MUX_COMBINED,135GL_TEXTURE0_ARB, //MUX_TEXEL0,136GL_TEXTURE1_ARB, //MUX_TEXEL1,137GL_CONSTANT_EXT, //MUX_PRIM,138GL_PRIMARY_COLOR_EXT, //MUX_SHADE,139GL_CONSTANT_EXT, //MUX_ENV,140GL_PREVIOUS_EXT, //MUX_COMBALPHA,141GL_TEXTURE0_ARB, //MUX_T0_ALPHA,142GL_TEXTURE1_ARB, //MUX_T1_ALPHA,143GL_CONSTANT_EXT, //MUX_PRIM_ALPHA,144GL_PRIMARY_COLOR_EXT, //MUX_SHADE_ALPHA,145GL_CONSTANT_EXT, //MUX_ENV_ALPHA,146GL_CONSTANT_EXT, //MUX_LODFRAC,147GL_CONSTANT_EXT, //MUX_PRIMLODFRAC,148GL_ZERO, //MUX_K5149GL_ZERO //MUX_UNK150};151152153//========================================================================154155GLint COGLColorCombinerTNT2::MapRGBArgs(uint8 arg)156{157return RGBArgsMap[arg&MUX_MASK];158}159160GLint COGLColorCombinerTNT2::MapRGBArgFlags(uint8 arg)161{162if( (arg & MUX_ALPHAREPLICATE) && (arg & MUX_COMPLEMENT) )163{164return GL_ONE_MINUS_SRC_ALPHA;165}166else if( (arg & MUX_ALPHAREPLICATE) )167{168if( arg == MUX_1 )169return GL_ONE_MINUS_SRC_ALPHA;170else171return GL_SRC_ALPHA;172}173else if(arg & MUX_COMPLEMENT || arg == MUX_1)174{175return GL_ONE_MINUS_SRC_COLOR;176}177else178return GL_SRC_COLOR;179}180181GLint COGLColorCombinerTNT2::MapAlphaArgs(uint8 arg)182{183return RGBArgsMap[arg&MUX_MASK];184}185186GLint COGLColorCombinerTNT2::MapAlphaArgFlags(uint8 arg)187{188if(arg & MUX_COMPLEMENT || arg == MUX_1)189{190return GL_ONE_MINUS_SRC_ALPHA;191}192else193return GL_SRC_ALPHA;194}195196//========================================================================197198void COGLColorCombinerTNT2::GenerateCombinerSetting(int index)199{200TNT2CombinerSaveType &res = m_vCompiledTNTSettings[index];201202// Texture unit 0203COGLTexture* pTexture = g_textures[gRSP.curTile].m_pCOGLTexture;204COGLTexture* pTexture1 = g_textures[(gRSP.curTile+1)&7].m_pCOGLTexture;205206if( pTexture ) m_pOGLRender->BindTexture(pTexture->m_dwTextureName, 0);207if( pTexture1 ) m_pOGLRender->BindTexture(pTexture1->m_dwTextureName, 1);208209// Texture unit 0210pglActiveTexture(GL_TEXTURE0_ARB);211glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV);212m_pOGLRender->EnableTexUnit(0,TRUE);213glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, res.unit1.rgbOp);214glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, res.unit1.alphaOp);215216if( res.unit1.rgbOp == GL_SUBTRACT_ARB )217{218glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, MapRGBArgs(res.unit1.rgbArg0^MUX_COMPLEMENT));219glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, MapRGBArgFlags(res.unit1.rgbArg0^MUX_COMPLEMENT));220}221else222{223glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, MapRGBArgs(res.unit1.rgbArg0));224glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, MapRGBArgFlags(res.unit1.rgbArg0));225}226227glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, MapRGBArgs(res.unit1.rgbArg1));228glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, MapRGBArgFlags(res.unit1.rgbArg1));229230glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, MapRGBArgs(res.unit1.rgbArg2));231glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, MapRGBArgFlags(res.unit1.rgbArg2));232233glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_RGB_EXT, MapRGBArgs(res.unit1.rgbArg3));234glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_RGB_EXT, MapRGBArgFlags(res.unit1.rgbArg3));235236if( res.unit1.alphaOp == GL_SUBTRACT_ARB )237{238glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, MapRGBArgs(res.unit1.alphaArg0^MUX_COMPLEMENT));239glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, MapAlphaArgFlags(res.unit1.alphaArg0^MUX_COMPLEMENT));240}241else242{243glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, MapRGBArgs(res.unit1.alphaArg0));244glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, MapAlphaArgFlags(res.unit1.alphaArg0));245}246247glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, MapRGBArgs(res.unit1.alphaArg1));248glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, MapAlphaArgFlags(res.unit1.alphaArg1));249250glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_ARB, MapRGBArgs(res.unit1.alphaArg2));251glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_ARB, MapAlphaArgFlags(res.unit1.alphaArg2));252253glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_ALPHA_EXT, MapRGBArgs(res.unit1.rgbArg3));254glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_ALPHA_EXT, MapAlphaArgFlags(res.unit1.rgbArg3));255256pglActiveTexture(GL_TEXTURE1_ARB);257glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV);258259if( m_maxTexUnits > 1 && res.numOfUnits > 1 )260{261glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, res.unit2.rgbOp);262glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, res.unit2.alphaOp);263264glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, MapRGBArgs(res.unit2.rgbArg0));265glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, MapRGBArgFlags(res.unit2.rgbArg0));266267glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, MapRGBArgs(res.unit2.rgbArg1));268glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, MapRGBArgFlags(res.unit2.rgbArg1));269270glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, MapRGBArgs(res.unit2.rgbArg2));271glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, MapRGBArgFlags(res.unit2.rgbArg2));272273glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_RGB_EXT, MapRGBArgs(res.unit2.rgbArg3));274glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_RGB_EXT, MapRGBArgFlags(res.unit2.rgbArg3));275276glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, MapRGBArgs(res.unit2.alphaArg0));277glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, MapAlphaArgFlags(res.unit2.alphaArg0));278279glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, MapRGBArgs(res.unit2.alphaArg1));280glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, MapAlphaArgFlags(res.unit2.alphaArg1));281282glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_ARB, MapRGBArgs(res.unit2.alphaArg2));283glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_ARB, MapAlphaArgFlags(res.unit2.alphaArg2));284285glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_ALPHA_EXT, MapRGBArgs(res.unit2.alphaArg3));286glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_ALPHA_EXT, MapAlphaArgFlags(res.unit2.alphaArg3));287288m_pOGLRender->EnableTexUnit(1,TRUE);289}290else291{292//m_pOGLRender->EnableTexUnit(1,FALSE);293}294}295296void COGLColorCombinerTNT2::GenerateCombinerSettingConstants(int index)297{298TNT2CombinerSaveType &res = m_vCompiledTNTSettings[index];299for( int i=0; i<2; i++ )300{301float *fv;302pglActiveTextureARB(GL_TEXTURE0_ARB+i);303switch( res.units[i].constant & MUX_MASK )304{305case MUX_PRIM:306fv = GetPrimitiveColorfv();307glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR,fv);308break;309case MUX_ENV:310fv = GetEnvColorfv();311glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR,fv);312break;313case MUX_LODFRAC:314{315float frac = gRDP.LODFrac / 255.0f;316float tempf[4] = {frac,frac,frac,frac};317glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR,tempf);318break;319}320case MUX_PRIMLODFRAC:321{322float frac = gRDP.primLODFrac / 255.0f;323float tempf[4] = {frac,frac,frac,frac};324glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR,tempf);325break;326}327}328}329}330331332333334