TMP more stuff

This commit is contained in:
Anthony Miles 2019-11-30 00:39:50 +13:00 committed by patrickvl
parent 62015b1499
commit da6fc5f35c
2 changed files with 97 additions and 45 deletions

View File

@ -18,36 +18,67 @@ struct VS_OUTPUT
float4 oT3 : TEXCOORD3; // Texture Coord 0
};
extern float4 c[192]; // Constant registers
static float4 r[16]; // Temporary registers
extern float4 hostConstants[192]; // Constant registers
float4 c(int index);
static int a; // address register
VS_OUTPUT defaultOut() {
VS_OUTPUT o;
// Initialize default values
o.oPos = float4(0, 0, 0, 1);
o.oD0 = float4(0, 0, 0, 1);
o.oD1 = float4(0, 0, 0, 1);
o.oFog = 0;
o.oPts = 0;
o.oB0 = float4(0, 0, 0, 1);
o.oB1 = float4(0, 0, 0, 1);
o.oT0 = float4(0, 0, 0, 1);
o.oT1 = float4(0, 0, 0, 1);
o.oT2 = float4(0, 0, 0, 1);
o.oT3 = float4(0, 0, 0, 1);
return o;
}
VS_OUTPUT main(const VS_INPUT xIn)
{
VS_OUTPUT xOut = defaultOut();
// Input registers
float4 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15;
// Temporary variables
float4 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11;
r0 = r1 = r2 = r3 = r4 = r5 = r6 = r7 = r8 = r9 = r10 = r11 = float4(0, 0, 0, 1); // TODO correct?
// Output variables
float4 oPos, oD0, oD1, oB0, oB1, oT0, oT1, oT2, oT3;
oPos = oD0 = oD1 = oB0 = oB1 = oT0 = oT1 = oT2 = oT3 = float4(0, 0, 0, 1); // TODO correct?
float oFog = 0, oPts = 0;
// Initialize input variables
v0 = xIn.v[0];
v1 = xIn.v[1];
v2 = xIn.v[2];
v3 = xIn.v[3];
v4 = xIn.v[4];
v5 = xIn.v[5];
v6 = xIn.v[6];
v7 = xIn.v[7];
v8 = xIn.v[8];
v9 = xIn.v[9];
v10 = xIn.v[10];
v11 = xIn.v[11];
v12 = xIn.v[12];
v13 = xIn.v[13];
v14 = xIn.v[14];
v15 = xIn.v[15];
// Insert Xbox shader here
<Xbox Shader>
// Copy variables to output struct
VS_OUTPUT xOut;
xOut.oPos = oPos;
xOut.oD0 = oD0;
xOut.oD1 = oD1;
xOut.oFog = oFog;
xOut.oPts = oPts;
xOut.oB0 = oB0;
xOut.oB1 = oB1;
xOut.oT0 = oT0;
xOut.oT1 = oT1;
xOut.oT2 = oT2;
xOut.oT3 = oT3;
return xOut;
}
// Account for Xbox's negative constant indexes
// Map Xbox [-96, 95] to Host [0, 191]
float4 c(int index) {
return hostConstants[index + 96];
}

View File

@ -2754,6 +2754,11 @@ extern HRESULT EmuRecompileVshFunction
DbgVshPrintf("%s", pXboxShaderDisassembly.str().c_str());
DbgVshPrintf("-----------------------\n");
DbgVshPrintf("-- HLSL conversion 1 ---\n");
DbgVshPrintf("%s", BuildShader(pShader));
DbgVshPrintf("-----------------------\n");
VshConvertShader(pShader, bNoReservedConstants);
VshWriteShader(pShader, pHostShaderDisassembly, pRecompiledDeclaration, TRUE);
@ -2764,7 +2769,7 @@ extern HRESULT EmuRecompileVshFunction
DbgVshPrintf("%s", finalHostShader.c_str());
DbgVshPrintf("-----------------------\n");
DbgVshPrintf("-- HLSL conversion ---\n");
DbgVshPrintf("-- HLSL conversion 2 ---\n");
DbgVshPrintf("%s", BuildShader(pShader));
DbgVshPrintf("-----------------------\n");
@ -2931,7 +2936,7 @@ std::string ToHlsl(VSH_IMD_OUTPUT& dest) {
switch (dest.Type)
{
case IMD_OUTPUT_O:
hlsl << "xOut." << OReg_Name[dest.Address];
hlsl << OReg_Name[dest.Address];
break;
case IMD_OUTPUT_A0X:
hlsl << "a";
@ -2940,43 +2945,59 @@ std::string ToHlsl(VSH_IMD_OUTPUT& dest) {
hlsl << "c[" << dest.Address << "]"; //todo we can output to constants...?
break;
case IMD_OUTPUT_R:
hlsl << "r[" << dest.Address << "]";
hlsl << "r" << dest.Address;
break;
default:
break;
}
// If we're not writing all channels, write the mask
if (!(dest.Mask[0] && dest.Mask[1] && dest.Mask[2] && dest.Mask[3]))
{
hlsl << "." << (dest.Mask[0] ? "x" : "")
<< (dest.Mask[1] ? "y" : "")
<< (dest.Mask[2] ? "z" : "")
<< (dest.Mask[3] ? "w" : "");
}
return hlsl.str();
}
std::string ToHlsl(VSH_IMD_PARAMETER& parameter)
std::string ToHlsl(VSH_IMD_PARAMETER& paramMeta)
{
auto hlsl = std::stringstream();
hlsl << (parameter.Parameter.Neg ? "-" : "");
auto param = paramMeta.Parameter;
if (parameter.Parameter.ParameterType == PARAM_V)
hlsl << "xIn.";
hlsl << (param.Neg ? "-" : "");
hlsl << VshGetRegisterName(parameter.Parameter.ParameterType);
if (param.ParameterType == PARAM_C){
hlsl << "c";
if (parameter.Parameter.ParameterType == PARAM_C && parameter.IndexesWithA0_X)
{
// We'll use the c() function instead of direct indexing
// Only display the offset if it's not 0.
parameter.Parameter.Address
? hlsl << "[a+" << parameter.Parameter.Address << "]"
: hlsl << "[a]";
if (paramMeta.IndexesWithA0_X) {
param.Address
? hlsl << "(a+" << param.Address << ")"
: hlsl << "(a)";
}
else {
hlsl << "(" << param.Address << ")";
}
}
else
{
hlsl << "[" << parameter.Parameter.Address << "]";
else if (param.ParameterType == PARAM_R && param.Address == 12) {
// Replace r12 with oPos
hlsl << "oPos";
}
else {
hlsl << VshGetRegisterName(param.ParameterType) << param.Address;
}
// Only bother printing the swizzle if it is not .xyzw
if (!(parameter.Parameter.Swizzle[0] == SWIZZLE_X &&
parameter.Parameter.Swizzle[1] == SWIZZLE_Y &&
parameter.Parameter.Swizzle[2] == SWIZZLE_Z &&
parameter.Parameter.Swizzle[3] == SWIZZLE_W))
if (!(param.Swizzle[0] == SWIZZLE_X &&
param.Swizzle[1] == SWIZZLE_Y &&
param.Swizzle[2] == SWIZZLE_Z &&
param.Swizzle[3] == SWIZZLE_W ))
{
hlsl << ".";
@ -2984,14 +3005,14 @@ std::string ToHlsl(VSH_IMD_PARAMETER& parameter)
// "var.x" instead of "var.xxxx"
auto lastDiffIndex = 0;
for (int i = 1; i < 4; i++) {
if (parameter.Parameter.Swizzle[i] != parameter.Parameter.Swizzle[i-1])
if (param.Swizzle[i] != param.Swizzle[i-1])
lastDiffIndex = i;
}
for (int i = 0; i <= lastDiffIndex; i++)
{
char Swizzle = '?';
switch (parameter.Parameter.Swizzle[i])
switch (param.Swizzle[i])
{
case SWIZZLE_X:
Swizzle = 'x';
@ -3085,7 +3106,7 @@ std::string BuildShader(VSH_XBOX_SHADER* pShader) {
hlsl << ToHlsl("dest = x_sge(src0, src1)", xboxInstruction);
break;
case MAC_ARL:
hlsl << ToHlsl("a = src0", xboxInstruction);
hlsl << ToHlsl("a = floor(src0)", xboxInstruction);
break;
default:
EmuLog(LOG_LEVEL::WARNING, "TODO message");