void DecodedMuxForSemiPixelShader::Reset(void) { Decode(m_dwMux0, m_dwMux1); splitType[0] = CM_FMT_TYPE_NOT_CHECKED; splitType[1] = CM_FMT_TYPE_NOT_CHECKED; splitType[2] = CM_FMT_TYPE_NOT_CHECKED; splitType[3] = CM_FMT_TYPE_NOT_CHECKED; Hack(); gRSP.bProcessDiffuseColor = false; gRSP.bProcessSpecularColor = false; CheckCombineInCycle1(); if( g_curRomInfo.bTexture1Hack ) { ReplaceVal(MUX_TEXEL1,MUX_TEXEL0,2); ReplaceVal(MUX_TEXEL1,MUX_TEXEL0,3); } m_bTexel0IsUsed = isUsed(MUX_TEXEL0); m_bTexel1IsUsed = isUsed(MUX_TEXEL1); }
void DecodedMux::CheckCombineInCycle1(void) { if( isUsedInCycle(MUX_COMBINED,0,COLOR_CHANNEL) ) { ReplaceVal(MUX_COMBINED, MUX_SHADE, 0); } if( isUsedInCycle(MUX_COMBALPHA,0,COLOR_CHANNEL) ) { ReplaceVal(MUX_COMBALPHA, MUX_SHADE|MUX_ALPHAREPLICATE, 0); } if( isUsedInCycle(MUX_COMBINED,0,ALPHA_CHANNEL) ) { if( cA0 == MUX_COMBINED && cRGB0 == MUX_LODFRAC && bRGB0 == dRGB0 && bA0 == dA0 ) { cA0 = MUX_LODFRAC; } else { ReplaceVal(MUX_COMBINED, MUX_SHADE, 1); } } if( isUsedInCycle(MUX_COMBALPHA,0,ALPHA_CHANNEL) ) { ReplaceVal(MUX_COMBALPHA, MUX_SHADE, 1); } }
void DecodedMux::Hack(void) { if( options.enableHackForGames == HACK_FOR_TONYHAWK ) { if( gRSP.curTile == 1 ) { ReplaceVal(MUX_TEXEL1, MUX_TEXEL0, -1, MUX_MASK); } } else if( options.enableHackForGames == HACK_FOR_ZELDA || options.enableHackForGames == HACK_FOR_ZELDA_MM) { if( m_dwMux1 == 0xfffd9238 && m_dwMux0 == 0x00ffadff ) { ReplaceVal(MUX_TEXEL1, MUX_TEXEL0, -1, MUX_MASK); } else if( m_dwMux1 == 0xff5bfff8 && m_dwMux0 == 0x00121603 ) { // The Zelda road trace ReplaceVal(MUX_TEXEL1, MUX_0, -1, MUX_MASK); } } else if( options.enableHackForGames == HACK_FOR_MARIO_TENNIS ) { if( m_dwMux1 == 0xffebdbc0 && m_dwMux0 == 0x00ffb9ff ) { // Player shadow //m_decodedMux.dRGB0 = MUX_TEXEL0; //m_decodedMux.dRGB1 = MUX_COMBINED; cA1 = MUX_TEXEL0; } } else if( options.enableHackForGames == HACK_FOR_MARIO_GOLF ) { // Hack for Mario Golf if( m_dwMux1 == 0xf1ffca7e || m_dwMux0 == 0x00115407 ) { // The grass ReplaceVal(MUX_TEXEL0, MUX_TEXEL1, -1, MUX_MASK); } } else if( options.enableHackForGames == HACK_FOR_TOPGEARRALLY ) { //Mux=0x00317e025ffef3fa Used in TOP GEAR RALLY //Color0: (PRIM - ENV) * TEXEL1 + ENV //Color1: (COMBINED - 0) * TEXEL1 + 0 //Alpha0: (0 - 0) * 0 + TEXEL0 //Alpha1: (0 - 0) * 0 + TEXEL1 if( m_dwMux1 == 0x5ffef3fa || m_dwMux0 == 0x00317e02 ) { // The grass //ReplaceVal(MUX_TEXEL0, MUX_TEXEL1, -1, MUX_MASK); dA1 = MUX_COMBINED; //aA1 = MUX_COMBINED; //cA1 = MUX_TEXEL1; //dA1 = MUX_0; cRGB1 = MUX_TEXEL0; } } }
void DecodedMux::UseTextureForConstant(void) { int numofconst = HowManyConstFactors(); int numOftex = HowManyTextures(); if( numofconst > m_maxConstants && numOftex < m_maxTextures ) { // We can use a texture for a constant for( int i=0; i<2 && numofconst > m_maxConstants ; i++ ) { if( isUsed(MUX_TEXEL0+i) ) { continue; // can not use this texture } if( isUsed(MUX_PRIM) ) { ReplaceVal(MUX_PRIM, MUX_TEXEL0+i); m_ColorTextureFlag[i] = MUX_PRIM; numofconst--; continue; } if( isUsed(MUX_ENV) ) { ReplaceVal(MUX_ENV, MUX_TEXEL0+i); m_ColorTextureFlag[i] = MUX_ENV; numofconst--; continue; } if( isUsed(MUX_LODFRAC) ) { ReplaceVal(MUX_LODFRAC, MUX_TEXEL0+i); m_ColorTextureFlag[i] = MUX_LODFRAC; numofconst--; continue; } if( isUsed(MUX_PRIMLODFRAC) ) { ReplaceVal(MUX_PRIMLODFRAC, MUX_TEXEL0+i); m_ColorTextureFlag[i] = MUX_PRIMLODFRAC; numofconst--; continue; } } } }
void DecodedMuxForOGL14V2::UseTextureForConstant(void) { bool envused = isUsed(MUX_ENV); bool lodused = isUsed(MUX_LODFRAC); int numofconst = 0; if( envused ) numofconst++; if( lodused ) numofconst++; int numOftex = HowManyTextures(); if( numofconst > 0 && numOftex < 2 ) { // We can use a texture for a constant for( int i=0; i<2 && numofconst > 0 ; i++ ) { if( isUsed(MUX_TEXEL0+i) ) { continue; // can not use this texture } if( envused ) { ReplaceVal(MUX_ENV, MUX_TEXEL0+i); m_ColorTextureFlag[i] = MUX_ENV; numofconst--; envused = false; continue; } if( isUsed(MUX_LODFRAC) ) { ReplaceVal(MUX_LODFRAC, MUX_TEXEL0+i); m_ColorTextureFlag[i] = MUX_LODFRAC; numofconst--; continue; } if( isUsed(MUX_PRIMLODFRAC) ) { ReplaceVal(MUX_PRIMLODFRAC, MUX_TEXEL0+i); m_ColorTextureFlag[i] = MUX_PRIMLODFRAC; numofconst--; continue; } } } }
void DecodedMuxForOGL14V2::Simplify(void) { CheckCombineInCycle1(); if( g_curRomInfo.bTexture1Hack ) { ReplaceVal(MUX_TEXEL1,MUX_TEXEL0,2); ReplaceVal(MUX_TEXEL1,MUX_TEXEL0,3); } Reformat(); UseTextureForConstant(); Reformat(); m_bTexel0IsUsed = isUsed(MUX_TEXEL0); m_bTexel1IsUsed = isUsed(MUX_TEXEL1); }
AstNodePtr ArrayInterface:: impl_access_array_length( CPPAstInterface& fa, const AstNodePtr& array, int dim, int plus) { SymbolicVal rval; ArrayOptDescriptor desc; if (get_array_opt(fa, array, desc)) { if (!desc.get_length(dim, rval)) assert(false); } else { ArrayDefineDescriptor desc1; if (!ArrayAnnotation::get_inst()->known_array( fa, array, &desc1)) return AST_NULL; if (! desc1.get_length(dim, rval)) assert(false); } ReplaceVal(rval, SymbolicVar("this",AST_NULL), SymbolicAstWrap(array)); if (plus != 0) rval = rval + plus; return rval.CodeGen(fa); }
void DecodedMuxForPixelShader::Simplify(void) { CheckCombineInCycle1(); //Reformat(); if( g_curRomInfo.bTexture1Hack ) { ReplaceVal(MUX_TEXEL1,MUX_TEXEL0,2); ReplaceVal(MUX_TEXEL1,MUX_TEXEL0,3); } splitType[0] = CM_FMT_TYPE_NOT_USED; splitType[1] = CM_FMT_TYPE_NOT_USED; splitType[2] = CM_FMT_TYPE_NOT_USED; splitType[3] = CM_FMT_TYPE_NOT_USED; mType = CM_FMT_TYPE_NOT_USED; m_bTexel0IsUsed = isUsed(MUX_TEXEL0); m_bTexel1IsUsed = isUsed(MUX_TEXEL1); }
void DecodedMux::Simplify(void) { CheckCombineInCycle1(); if (gRDP.otherMode.text_lod) ConvertLODFracTo0(); if (g_curRomInfo.bTexture1Hack) { ReplaceVal(MUX_TEXEL1, MUX_TEXEL0, 2, MUX_MASK); ReplaceVal(MUX_TEXEL1, MUX_TEXEL0, 3, MUX_MASK); } Reformat(true); UseShadeForConstant(); Reformat(true); if (m_dwShadeColorChannelFlag == MUX_0) { MergeShadeWithConstants(); Reformat(true); } #ifdef ALLOW_USE_TEXTURE_FOR_CONSTANTS UseTextureForConstant(); for (int i=0; i<2; i++) { if (m_ColorTextureFlag[i] != 0) { if (m_dwShadeColorChannelFlag == m_ColorTextureFlag[i]) { ReplaceVal(MUX_SHADE, MUX_TEXEL0+i, N64Cycle0RGB, MUX_MASK); ReplaceVal(MUX_SHADE, MUX_TEXEL0+i, N64Cycle1RGB, MUX_MASK); m_dwShadeColorChannelFlag = 0; } if (m_dwShadeAlphaChannelFlag == m_ColorTextureFlag[i]) { ReplaceVal(MUX_SHADE, MUX_TEXEL0+i, N64Cycle0Alpha, MUX_MASK); ReplaceVal(MUX_SHADE, MUX_TEXEL0+i, N64Cycle1Alpha, MUX_MASK); ReplaceVal(MUX_SHADE|MUX_ALPHAREPLICATE, (MUX_TEXEL0+i)|MUX_ALPHAREPLICATE, N64Cycle0RGB, MUX_MASK_WITH_ALPHA); ReplaceVal(MUX_SHADE|MUX_ALPHAREPLICATE, (MUX_TEXEL0+i)|MUX_ALPHAREPLICATE, N64Cycle1RGB, MUX_MASK_WITH_ALPHA); m_dwShadeAlphaChannelFlag = 0; } } } Reformat(true); #endif m_bTexel0IsUsed = IsUsed(MUX_TEXEL0, MUX_MASK); m_bTexel1IsUsed = IsUsed(MUX_TEXEL1, MUX_MASK); }
void DecodedMux::ConvertLODFracTo0() { ReplaceVal(MUX_LODFRAC,MUX_0); ReplaceVal(MUX_PRIMLODFRAC,MUX_0); }
void DecodedMux::UseShadeForConstant(void) { // If shade is not used in the mux, we can use it for constants // This function should be called after constants have been merged bool doAlphaChannel = true; uint8 mask = (uint8)~MUX_COMPLEMENT; int constants = 0; if( isUsed(MUX_ENV) ) constants++; if( isUsed(MUX_PRIM) ) constants++; if( isUsed(MUX_LODFRAC) ) constants++; if( isUsed(MUX_PRIMLODFRAC) ) constants++; bool forceToUsed = constants>m_maxConstants; if( !isUsedInColorChannel(MUX_SHADE) && (forceToUsed || max(splitType[0], splitType[2]) >= CM_FMT_TYPE_A_MOD_C_ADD_D) ) { int countEnv = Count(MUX_ENV, N64Cycle0RGB, mask) + Count(MUX_ENV, N64Cycle1RGB, mask); int countPrim = Count(MUX_PRIM, N64Cycle0RGB, mask) + Count(MUX_PRIM, N64Cycle1RGB, mask); if( countEnv+countPrim > 0 ) { if( countPrim >= countEnv ) { //TRACE0("Use Shade for PRIM in color channel"); ReplaceVal(MUX_PRIM, MUX_SHADE, N64Cycle0RGB); ReplaceVal(MUX_PRIM, MUX_SHADE, N64Cycle1RGB); m_dwShadeColorChannelFlag = MUX_PRIM; } else if( countEnv>0 ) { //TRACE0("Use Shade for ENV in color channel"); ReplaceVal(MUX_ENV, MUX_SHADE, N64Cycle0RGB); ReplaceVal(MUX_ENV, MUX_SHADE, N64Cycle1RGB); m_dwShadeColorChannelFlag = MUX_ENV; } if( isUsedInColorChannel(MUX_SHADE|MUX_ALPHAREPLICATE, mask) ) { m_dwShadeAlphaChannelFlag = m_dwShadeColorChannelFlag; ReplaceVal((uint8)m_dwShadeColorChannelFlag, MUX_SHADE, N64Cycle0Alpha); ReplaceVal((uint8)m_dwShadeColorChannelFlag, MUX_SHADE, N64Cycle1Alpha); doAlphaChannel = false; } } } if( doAlphaChannel && !isUsedInAlphaChannel(MUX_SHADE) && !isUsedInColorChannel(MUX_SHADE|MUX_ALPHAREPLICATE,MUX_MASK_WITH_ALPHA)) { int countEnv = Count(MUX_ENV|MUX_ALPHAREPLICATE, N64Cycle0RGB, mask) + Count(MUX_ENV|MUX_ALPHAREPLICATE, N64Cycle1RGB, mask); int countPrim = Count(MUX_PRIM|MUX_ALPHAREPLICATE, N64Cycle0RGB, mask) + Count(MUX_PRIM|MUX_ALPHAREPLICATE, N64Cycle1RGB, mask); if( forceToUsed || max(splitType[1], splitType[3]) >= CM_FMT_TYPE_A_MOD_C_ADD_D || (max(splitType[0], splitType[2]) >= CM_FMT_TYPE_A_MOD_C_ADD_D && countEnv+countPrim > 0 ) ) { countEnv = Count(MUX_ENV, N64Cycle0Alpha) + Count(MUX_ENV, N64Cycle1Alpha) + Count(MUX_ENV|MUX_ALPHAREPLICATE, N64Cycle0RGB, mask) + Count(MUX_ENV|MUX_ALPHAREPLICATE, N64Cycle1RGB, mask); countPrim = Count(MUX_PRIM, N64Cycle0Alpha) + Count(MUX_PRIM, N64Cycle1Alpha) + Count(MUX_PRIM|MUX_ALPHAREPLICATE, N64Cycle0RGB, mask) + Count(MUX_PRIM|MUX_ALPHAREPLICATE, N64Cycle1RGB, mask); if( countEnv+countPrim > 0 ) { if( countPrim>0 && m_dwShadeColorChannelFlag == MUX_PRIM ) { //TRACE0("Use Shade for PRIM in alpha channel"); ReplaceVal(MUX_PRIM, MUX_SHADE, N64Cycle0Alpha); ReplaceVal(MUX_PRIM, MUX_SHADE, N64Cycle1Alpha); ReplaceVal(MUX_PRIM|MUX_ALPHAREPLICATE, MUX_SHADE|MUX_ALPHAREPLICATE, N64Cycle0RGB, mask); ReplaceVal(MUX_PRIM|MUX_ALPHAREPLICATE, MUX_SHADE|MUX_ALPHAREPLICATE, N64Cycle1RGB, mask); m_dwShadeAlphaChannelFlag = MUX_PRIM; } else if( countEnv>0 && m_dwShadeColorChannelFlag == MUX_ENV ) { //TRACE0("Use Shade for PRIM in alpha channel"); ReplaceVal(MUX_ENV, MUX_SHADE, N64Cycle0Alpha); ReplaceVal(MUX_ENV, MUX_SHADE, N64Cycle1Alpha); ReplaceVal(MUX_ENV|MUX_ALPHAREPLICATE, MUX_SHADE|MUX_ALPHAREPLICATE, N64Cycle0RGB, mask); ReplaceVal(MUX_ENV|MUX_ALPHAREPLICATE, MUX_SHADE|MUX_ALPHAREPLICATE, N64Cycle1RGB, mask); m_dwShadeAlphaChannelFlag = MUX_ENV; } else if( countPrim >= countEnv ) { //TRACE0("Use Shade for PRIM in alpha channel"); ReplaceVal(MUX_PRIM, MUX_SHADE, N64Cycle0Alpha); ReplaceVal(MUX_PRIM, MUX_SHADE, N64Cycle1Alpha); ReplaceVal(MUX_PRIM|MUX_ALPHAREPLICATE, MUX_SHADE|MUX_ALPHAREPLICATE, N64Cycle0RGB, mask); ReplaceVal(MUX_PRIM|MUX_ALPHAREPLICATE, MUX_SHADE|MUX_ALPHAREPLICATE, N64Cycle1RGB, mask); m_dwShadeAlphaChannelFlag = MUX_PRIM; } else if( countEnv>0 ) { //TRACE0("Use Shade for ENV in alpha channel"); ReplaceVal(MUX_ENV, MUX_SHADE, N64Cycle0Alpha); ReplaceVal(MUX_ENV, MUX_SHADE, N64Cycle1Alpha); ReplaceVal(MUX_ENV|MUX_ALPHAREPLICATE, MUX_SHADE|MUX_ALPHAREPLICATE, N64Cycle0RGB, mask); ReplaceVal(MUX_ENV|MUX_ALPHAREPLICATE, MUX_SHADE|MUX_ALPHAREPLICATE, N64Cycle1RGB, mask); m_dwShadeAlphaChannelFlag = MUX_ENV; } } } } }