void COGLColorCombiner4::InitCombinerCycle12(void) { #ifdef DEBUGGER if( debuggerDropCombiners ) { UpdateCombiner(m_pDecodedMux->m_dwMux0,m_pDecodedMux->m_dwMux1); m_vCompiledSettings.clear(); m_dwLastMux0 = m_dwLastMux1 = 0; debuggerDropCombiners = false; } #endif m_pOGLRender->EnableMultiTexture(); bool combinerIsChanged = false; if( m_pDecodedMux->m_dwMux0 != m_dwLastMux0 || m_pDecodedMux->m_dwMux1 != m_dwLastMux1 || m_lastIndex < 0 ) { combinerIsChanged = true; m_lastIndex = FindCompiledMux(); if( m_lastIndex < 0 ) // Can not found { m_lastIndex = ParseDecodedMux(); #ifdef DEBUGGER DisplaySimpleMuxString(); #endif } m_dwLastMux0 = m_pDecodedMux->m_dwMux0; m_dwLastMux1 = m_pDecodedMux->m_dwMux1; } if( m_bCycleChanged || combinerIsChanged || gRDP.texturesAreReloaded || gRDP.colorsAreReloaded ) { if( m_bCycleChanged || combinerIsChanged ) { GenerateCombinerSettingConstants(m_lastIndex); GenerateCombinerSetting(m_lastIndex); } else if( gRDP.colorsAreReloaded ) { GenerateCombinerSettingConstants(m_lastIndex); } m_pOGLRender->SetAllTexelRepeatFlag(); gRDP.colorsAreReloaded = false; gRDP.texturesAreReloaded = false; } else { m_pOGLRender->SetAllTexelRepeatFlag(); } }
int CNvTNTCombiner::SaveParserResult(TNT2CombinerSaveType &result) { result.dwMux0 = (*m_ppDecodedMux)->m_dwMux0; result.dwMux1 = (*m_ppDecodedMux)->m_dwMux1; m_vCompiledTNTSettings.push_back(result); m_lastIndexTNT = m_vCompiledTNTSettings.size()-1; #ifdef _DEBUG if( logCombiners ) { DisplaySimpleMuxString(); } #endif return m_lastIndexTNT; }
int COGLColorCombiner4::SaveParsedResult(OGLExtCombinerSaveType &result) { result.dwMux0 = m_pDecodedMux->m_dwMux0; result.dwMux1 = m_pDecodedMux->m_dwMux1; for( int n=0; n<result.numOfUnits; n++ ) { for( int i=0; i<3; i++ ) { result.units[n].glRGBArgs[i] = 0; result.units[n].glRGBFlags[i] = 0; result.units[n].glAlphaArgs[i] = 0; result.units[n].glAlphaFlags[i] = 0; if( result.units[n].rgbComb.args[i] != CM_IGNORE_BYTE ) { result.units[n].glRGBArgs[i] = MapRGBArgs(result.units[n].rgbComb.args[i]); result.units[n].glRGBFlags[i] = MapRGBArgFlags(result.units[n].rgbComb.args[i]); } if( result.units[n].alphaComb.args[i] != CM_IGNORE_BYTE ) { result.units[n].glAlphaArgs[i] = MapAlphaArgs(result.units[n].alphaComb.args[i]); result.units[n].glAlphaFlags[i] = MapAlphaArgFlags(result.units[n].alphaComb.args[i]); } } } m_vCompiledSettings.push_back(result); m_lastIndex = m_vCompiledSettings.size()-1; #ifdef DEBUGGER if( logCombiners ) { DisplaySimpleMuxString(); } #endif return m_lastIndex; }
int COGLColorCombiner4v2::SaveParsedResult(OGLExtCombinerSaveType &result) { result.dwMux0 = m_pDecodedMux->m_dwMux0; result.dwMux1 = m_pDecodedMux->m_dwMux1; int n; for( n=0; n<result.numOfUnits; n++ ) { for( int i=0; i<3; i++ ) { result.units[n].glRGBArgs[i] = 0; result.units[n].glRGBFlags[i] = 0; result.units[n].glAlphaArgs[i] = 0; result.units[n].glAlphaFlags[i] = 0; if( result.units[n].rgbComb.args[i] != CM_IGNORE_BYTE ) { result.units[n].glRGBArgs[i] = MapRGBArgs(result.units[n].rgbComb.args[i]); if( result.units[n].glRGBArgs[i] == GL_TEXTURE3 && !result.envIsUsed ) result.units[n].glRGBArgs[i] = GL_TEXTURE2; result.units[n].glRGBFlags[i] = MapRGBArgFlags(result.units[n].rgbComb.args[i]); } if( result.units[n].alphaComb.args[i] != CM_IGNORE_BYTE ) { result.units[n].glAlphaArgs[i] = MapAlphaArgs(result.units[n].alphaComb.args[i]); if( result.units[n].glAlphaArgs[i] == GL_TEXTURE3 && !result.envIsUsed ) result.units[n].glAlphaArgs[i] = GL_TEXTURE2; result.units[n].glAlphaFlags[i] = MapAlphaArgFlags(result.units[n].alphaComb.args[i]); } } if( isGLtex(result.units[n].glRGBArgs[0]) && isGLtex(result.units[n].glRGBArgs[1]) && isGLtex(result.units[n].glRGBArgs[2]) ) { // result.units[n].glRGBArgs[2] = GL_CONSTANT; } if( isGLtex(result.units[n].glAlphaArgs[0]) && isGLtex(result.units[n].glAlphaArgs[1]) && isGLtex(result.units[n].glAlphaArgs[2]) ) { // result.units[n].glRGBArgs[2] = GL_CONSTANT; } } int extraUnit = 0; if( result.envIsUsed ) extraUnit++; if( result.lodFracIsUsed ) extraUnit++; for( n=result.numOfUnits; n<result.numOfUnits+extraUnit; n++ ) { for( int i=0; i<3; i++ ) { result.units[n].rgbComb.args[i]=CM_IGNORE_BYTE; result.units[n].alphaComb.args[i]=CM_IGNORE_BYTE; result.units[n].glRGBArgs[i] = 0; result.units[n].glRGBFlags[i] = 0; result.units[n].glAlphaArgs[i] = 0; result.units[n].glAlphaFlags[i] = 0; } result.units[n].rgbComb.args[0]=MUX_COMBINED; result.units[n].alphaComb.args[0]=MUX_COMBINED; result.units[n].rgbOp = GL_REPLACE; result.units[n].alphaOp = GL_REPLACE; // result.units[n].glRGBArgs[0] = GL_PREVIOUS; // result.units[n].glRGBArgs[1] = GL_PREVIOUS; result.units[n].rgbFlag0gl = GL_SRC_COLOR; result.units[n].rgbFlag1gl = GL_SRC_COLOR; // result.units[n].glAlphaArgs[0] = GL_PREVIOUS; // result.units[n].glAlphaArgs[1] = GL_PREVIOUS; result.units[n].alphaFlag0gl = GL_SRC_ALPHA; result.units[n].alphaFlag1gl = GL_SRC_ALPHA; } result.numOfUnits += extraUnit; m_vCompiledSettings.push_back(result); m_lastIndex = m_vCompiledSettings.size()-1; #ifdef DEBUGGER if( logCombiners ) { DisplaySimpleMuxString(); } #endif return m_lastIndex; }
int CDirectXPixelShaderCombiner::GeneratePixelShaderFromMux(void) { char buf[100]; /************************************************************************/ /* /* STEP 1: generate pixel shader text according to current MUX /* /* Ideas of implementation: /* - 8 arithmetic instructions are just enough to simulate N64 combiners /* in such a way: /* For color channel /* r0.rgb = a1-b1 /* r0.rgb = r0*c1+d1 /* r0.rgb = a2-b2 /* r0.rgb = r0*c2+dd /* For alpha channel /* r0.a = a1-b1 /* r0.a = r0*c1+d1 /* r0.a = a2-b2 /* r0.a = r0*c2+dd /* /* - Constant definition: /* c0: = 0 will never change /* c1: = 1 will never change /* c2: = MUX_PRIM /* c3: = MUX_ENV /* c4: = MUX_LOADFRAC /* c5: = MUX_PRIMLOADPRAC /* /* - Will use register r0 as MUX_COMB, never changes /* /************************************************************************/ DecodedMux &m = *m_pDecodedMux; m_textBuf[0] = 0; strcat(m_textBuf, "ps.1.1\n"); strcat(m_textBuf, "def c0, 0.0, 0.0, 0.0, 0.0\n"); strcat(m_textBuf, "def c1, 1.0, 1.0, 1.0, 1.0\n"); if( m.m_bTexel0IsUsed ) strcat(m_textBuf, "tex t0\n"); if( m.m_bTexel1IsUsed ) strcat(m_textBuf, "tex t1\n"); // Color channel 1 sprintf(buf, "sub r1.rgb, %s, %s\n", MuxToC(m.aRGB0), MuxToC(m.bRGB0) ); strcat(m_textBuf, buf); sprintf(buf, "mad_sat r1.rgb, r1, %s, %s\n", MuxToC(m.cRGB0), MuxToC(m.dRGB0) ); strcat(m_textBuf, buf); // Alpha channel 1 sprintf(buf, "sub r1.a, %s, %s\n", MuxToA(m.aA0), MuxToA(m.bA0) ); strcat(m_textBuf, buf); sprintf(buf, "mad_sat r1.a, r1, %s, %s\n", MuxToA(m.cA0), MuxToA(m.dA0) ); strcat(m_textBuf, buf); // Color channel 2 sprintf(buf, "sub r0.rgb, %s, %s\n", MuxToC(m.aRGB1), MuxToC(m.bRGB1) ); strcat(m_textBuf, buf); sprintf(buf, "mad_sat r0.rgb, r0, %s, %s\n", MuxToC(m.cRGB1), MuxToC(m.dRGB1) ); strcat(m_textBuf, buf); // Alpha channel 2 sprintf(buf, "sub r0.a, %s, %s\n", MuxToA(m.aA1), MuxToA(m.bA1) ); strcat(m_textBuf, buf); sprintf(buf, "mad_sat r0.a, r0, %s, %s\n", MuxToA(m.cA1), MuxToA(m.dA1) ); strcat(m_textBuf, buf); // Step 2: Compile the shade text to generate a new pixel shader binary PixelShaderEntry newEntry; newEntry.mux64 = m_pD3DRender->m_Mux; HRESULT e = D3DXAssembleShader( m_textBuf, strlen(m_textBuf), 0, NULL, NULL, &(newEntry.pVS), NULL ); if( e != S_OK ) { #ifdef _DEBUG TRACE0("Error to assemble shader"); TRACE0(m_textBuf); DisplaySimpleMuxString(); #endif } e = g_pD3DDev->CreatePixelShader( (DWORD*)newEntry.pVS->GetBufferPointer(), &(newEntry.pShader) ); if( e != S_OK ) { TRACE0("Error to create shader"); TRACE0(m_textBuf); newEntry.dwShaderID = 0; newEntry.pShader = NULL; } #ifdef _DEBUG newEntry.pShaderText = new char[strlen(m_textBuf)+1]; strcpy(newEntry.pShaderText, m_textBuf); #else newEntry.pShaderText = NULL; #endif m_pixelShaderList.push_back(newEntry); return m_pixelShaderList.size()-1; }