When entering in-game, Turok generates a few pixel shaders that d3d8to9 marks as invalid. This branch will improve upon them.
This commit is contained in:
parent
0d1c7c2a80
commit
eb900b9713
|
@ -2164,7 +2164,7 @@ PSH_RECOMPILED_SHADER PSH_XBOX_SHADER::Decode(XTL::X_D3DPIXELSHADERDEF *pPSDef)
|
|||
if (RemoveNops())
|
||||
Log("RemoveNops");
|
||||
|
||||
if (RemoveUselessWrites())
|
||||
while (RemoveUselessWrites())
|
||||
Log("RemoveUselessWrites");
|
||||
|
||||
if (ConvertConstantsToNative(pPSDef, /*Recompiled=*/&Result))
|
||||
|
@ -2173,7 +2173,7 @@ PSH_RECOMPILED_SHADER PSH_XBOX_SHADER::Decode(XTL::X_D3DPIXELSHADERDEF *pPSDef)
|
|||
ConvertXboxOpcodesToNative(pPSDef);
|
||||
Log("ConvertXboxOpcodesToNative");
|
||||
|
||||
if (RemoveUselessWrites()) // twice!
|
||||
while (RemoveUselessWrites()) // again
|
||||
Log("RemoveUselessWrites");
|
||||
|
||||
// Resolve all differences :
|
||||
|
@ -2830,13 +2830,13 @@ bool PSH_XBOX_SHADER::ConvertXMMToNative_Except3RdOutput(int i)
|
|||
if (Cur->Output[0].Type == PARAM_DISCARD)
|
||||
{
|
||||
Cur->Output[0].Type = PARAM_R;
|
||||
Cur->Output[0].Address = FakeRegNr_Xmm1;
|
||||
Cur->Output[0].Address = FakeRegNr_Xmm1; // 'r4'
|
||||
}
|
||||
|
||||
if (Cur->Output[1].Type == PARAM_DISCARD)
|
||||
{
|
||||
Cur->Output[1].Type = PARAM_R;
|
||||
Cur->Output[1].Address = FakeRegNr_Xmm2;
|
||||
Cur->Output[1].Address = FakeRegNr_Xmm2; // 'r5'
|
||||
}
|
||||
|
||||
// Generate a MUL for the 1st output :
|
||||
|
@ -2972,7 +2972,7 @@ void PSH_XBOX_SHADER::ConvertXFCToNative(int i)
|
|||
{
|
||||
// Change SUM into a fake register, which will be resolved later :
|
||||
CurArg->Type = PARAM_R;
|
||||
CurArg->Address = FakeRegNr_Sum;
|
||||
CurArg->Address = FakeRegNr_Sum; // 'r2'
|
||||
NeedsSum = true;
|
||||
break;
|
||||
}
|
||||
|
@ -2981,7 +2981,7 @@ void PSH_XBOX_SHADER::ConvertXFCToNative(int i)
|
|||
{
|
||||
// Change PROD into a fake register, which will be resolved later :
|
||||
CurArg->Type = PARAM_R;
|
||||
CurArg->Address = FakeRegNr_Prod;
|
||||
CurArg->Address = FakeRegNr_Prod; // 'r3'
|
||||
NeedsProd = true;
|
||||
break;
|
||||
}
|
||||
|
@ -3000,7 +3000,7 @@ void PSH_XBOX_SHADER::ConvertXFCToNative(int i)
|
|||
{
|
||||
// Add a new opcode that calculates r0*v1 :
|
||||
Ins.Initialize(PO_MUL);
|
||||
Ins.Output[0].SetRegister(PARAM_R, FakeRegNr_Sum, MASK_RGBA);
|
||||
Ins.Output[0].SetRegister(PARAM_R, FakeRegNr_Sum, MASK_RGBA); // 'r2'
|
||||
|
||||
Ins.Parameters[0].SetRegister(PARAM_R, 0, MASK_RGB);
|
||||
Ins.Parameters[1].SetRegister(PARAM_V, 1, MASK_RGB);
|
||||
|
@ -3022,7 +3022,7 @@ void PSH_XBOX_SHADER::ConvertXFCToNative(int i)
|
|||
{
|
||||
// Add a new opcode that calculates E*F :
|
||||
Ins.Initialize(PO_MUL);
|
||||
Ins.Output[0].SetRegister(PARAM_R, FakeRegNr_Prod, MASK_RGBA);
|
||||
Ins.Output[0].SetRegister(PARAM_R, FakeRegNr_Prod, MASK_RGBA); // 'r3'
|
||||
Ins.Parameters[0] = Cur.Parameters[4]; // E
|
||||
Ins.Parameters[1] = Cur.Parameters[5]; // F
|
||||
InsertIntermediate(&Ins, InsertPos);
|
||||
|
@ -3428,7 +3428,7 @@ bool PSH_XBOX_SHADER::CombineInstructions()
|
|||
}
|
||||
|
||||
// Fix Crash bandicoot xfc leftover r3 :
|
||||
if (Op0->Output[0].IsRegister(PARAM_R, FakeRegNr_Prod))
|
||||
if (Op0->Output[0].IsRegister(PARAM_R, FakeRegNr_Prod)) // 'r3'
|
||||
{
|
||||
// The final combiner uses r3, try to use r1 instead :
|
||||
if (IsRegisterFreeFromIndexOnwards(i, PARAM_R, 1))
|
||||
|
|
Loading…
Reference in New Issue