PixelShaderGen: Use integer math for tev outputs.

This commit is contained in:
Tony Wasserka 2013-08-14 16:51:00 +02:00
parent 654442feb7
commit aaa8e74a68

View File

@ -122,14 +122,14 @@ static const char *tevOpTable[] = { // TEV
static const char *tevCInputTable[] = // CC static const char *tevCInputTable[] = // CC
{ {
"(prev.rgb)", // CPREV, "(float3(iprev.rgb)/255.0)", // CPREV,
"(prev.aaa)", // APREV, "(float3(iprev.aaa)/255.0)", // APREV,
"(c0.rgb)", // C0, "(float3(ic0.rgb)/255.0)", // C0,
"(c0.aaa)", // A0, "(float3(ic0.aaa)/255.0)", // A0,
"(c1.rgb)", // C1, "(float3(ic1.rgb)/255.0)", // C1,
"(c1.aaa)", // A1, "(float3(ic1.aaa)/255.0)", // A1,
"(c2.rgb)", // C2, "(float3(ic2.rgb)/255.0)", // C2,
"(c2.aaa)", // A2, "(float3(ic2.aaa)/255.0)", // A2,
"(float3(itextemp.rgb)/255.0)", // TEXC, "(float3(itextemp.rgb)/255.0)", // TEXC,
"(float3(itextemp.aaa)/255.0)", // TEXA, "(float3(itextemp.aaa)/255.0)", // TEXA,
"(float3(irastemp.rgb)/255.0)", // RASC, "(float3(irastemp.rgb)/255.0)", // RASC,
@ -139,14 +139,14 @@ static const char *tevCInputTable[] = // CC
"(float3(ikonsttemp.rgb)/255.0)", //"konsttemp.rgb", // KONST "(float3(ikonsttemp.rgb)/255.0)", //"konsttemp.rgb", // KONST
"float3(0.0, 0.0, 0.0)", // ZERO "float3(0.0, 0.0, 0.0)", // ZERO
///added extra values to map clamped values ///added extra values to map clamped values
"(cprev.rgb)", // CPREV, "(float3(icprev.rgb)/255.0)", // CPREV,
"(cprev.aaa)", // APREV, "(float3(icprev.aaa)/255.0)", // APREV,
"(cc0.rgb)", // C0, "(float3(icc0.rgb)/255.0)", // C0,
"(cc0.aaa)", // A0, "(float3(icc0.aaa)/255.0)", // A0,
"(cc1.rgb)", // C1, "(float3(icc1.rgb)/255.0)", // C1,
"(cc1.aaa)", // A1, "(float3(icc1.aaa)/255.0)", // A1,
"(cc2.rgb)", // C2, "(float3(icc2.rgb)/255.0)", // C2,
"(cc2.aaa)", // A2, "(float3(icc2.aaa)/255.0)", // A2,
"(float3(itextemp.rgb)/255.0)", // TEXC, "(float3(itextemp.rgb)/255.0)", // TEXC,
"(float3(itextemp.aaa)/255.0)", // TEXA, "(float3(itextemp.aaa)/255.0)", // TEXA,
"(float3(icrastemp.rgb)/255.0)", // RASC, "(float3(icrastemp.rgb)/255.0)", // RASC,
@ -160,19 +160,19 @@ static const char *tevCInputTable[] = // CC
static const char *tevAInputTable[] = // CA static const char *tevAInputTable[] = // CA
{ {
"prev", // APREV, "(float4(iprev)/255.0)", // APREV,
"c0", // A0, "(float4(ic0)/255.0)", // A0,
"c1", // A1, "(float4(ic1)/255.0)", // A1,
"c2", // A2, "(float4(ic2)/255.0)", // A2,
"(float4(itextemp) / 255.0)", // TEXA, "(float4(itextemp) / 255.0)", // TEXA,
"(float4(irastemp) / 255.0)", // RASA, "(float4(irastemp) / 255.0)", // RASA,
"(float4(ikonsttemp) / 255.0)", // KONST, (hw1 had quarter) "(float4(ikonsttemp) / 255.0)", // KONST, (hw1 had quarter)
"float4(0.0, 0.0, 0.0, 0.0)", // ZERO "float4(0.0, 0.0, 0.0, 0.0)", // ZERO
///added extra values to map clamped values ///added extra values to map clamped values
"cprev", // APREV, "(float4(icprev)/255.0)", // APREV,
"cc0", // A0, "(float4(icc0)/255.0)", // A0,
"cc1", // A1, "(float4(icc1)/255.0)", // A1,
"cc2", // A2, "(float4(icc2)/255.0)", // A2,
"(float4(itextemp) / 255.0)", // TEXA, "(float4(itextemp) / 255.0)", // TEXA,
"(float4(icrastemp) / 255.0)", // RASA, "(float4(icrastemp) / 255.0)", // RASA,
"(float4(ickonsttemp) / 255.0)", // KONST, (hw1 had quarter) "(float4(ickonsttemp) / 255.0)", // KONST, (hw1 had quarter)
@ -195,8 +195,8 @@ static const char *tevRasTable[] =
//static const char *tevTexFunc[] = { "tex2D", "texRECT" }; //static const char *tevTexFunc[] = { "tex2D", "texRECT" };
static const char *tevCOutputTable[] = { "prev.rgb", "c0.rgb", "c1.rgb", "c2.rgb" }; static const char *tevCOutputTable[] = { "iprev.rgb", "ic0.rgb", "ic1.rgb", "ic2.rgb", "icprev.rgb", "icc0.rgb", "icc1.rgb", "icc2.rgb", };
static const char *tevAOutputTable[] = { "prev.a", "c0.a", "c1.a", "c2.a" }; static const char *tevAOutputTable[] = { "iprev.a", "ic0.a", "ic1.a", "ic2.a", "icprev.a", "icc0.a", "icc1.a", "icc2.a" };
static const char *tevIndAlphaSel[] = {"", "x", "y", "z"}; static const char *tevIndAlphaSel[] = {"", "x", "y", "z"};
static const char *tevIndAlphaMask[] = {"0xF8", "0xE0", "0xF0", "0xF8"}; static const char *tevIndAlphaMask[] = {"0xF8", "0xE0", "0xF0", "0xF8"};
static const char *tevIndBiasField[] = {"", "x", "y", "xy", "z", "xz", "yz", "xyz"}; // indexed by bias static const char *tevIndBiasField[] = {"", "x", "y", "xy", "z", "xz", "yz", "xyz"}; // indexed by bias
@ -389,14 +389,14 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T
out.Write(" ) {\n"); out.Write(" ) {\n");
} }
out.Write(" float4 c0 = " I_COLORS"[1], c1 = " I_COLORS"[2], c2 = " I_COLORS"[3], prev = float4(0.0, 0.0, 0.0, 0.0);\n" out.Write(" int4 ic0 = int4(round(" I_COLORS"[1] * 255.0)), ic1 = int4(round(" I_COLORS"[2] * 255.0)), ic2 = int4(round(" I_COLORS"[3] * 255.0)), iprev = int4(0, 0, 0, 0);\n"
" int4 irastemp = int4(0, 0, 0, 0), itextemp = int4(0, 0, 0, 0), ikonsttemp = int4(0, 0, 0, 0);\n" " int4 irastemp = int4(0, 0, 0, 0), itextemp = int4(0, 0, 0, 0), ikonsttemp = int4(0, 0, 0, 0);\n"
" float3 comp16 = float3(1.0, 255.0, 0.0), comp24 = float3(1.0, 255.0, 255.0*255.0);\n" " float3 comp16 = float3(1.0, 255.0, 0.0), comp24 = float3(1.0, 255.0, 255.0*255.0);\n"
" float alphabump=0.0;\n" " float alphabump=0.0;\n"
" float3 tevcoord=float3(0.0, 0.0, 0.0);\n" " float3 tevcoord=float3(0.0, 0.0, 0.0);\n"
" float2 wrappedcoord=float2(0.0,0.0), tempcoord=float2(0.0,0.0);\n" " float2 wrappedcoord=float2(0.0,0.0), tempcoord=float2(0.0,0.0);\n"
" float4 cc0=float4(0.0,0.0,0.0,0.0), cc1=float4(0.0,0.0,0.0,0.0);\n" " int4 icc0=int4(0, 0, 0, 0), icc1=int4(0, 0, 0, 0);\n"
" float4 cc2=float4(0.0,0.0,0.0,0.0), cprev=float4(0.0,0.0,0.0,0.0);\n" " int4 icc2=int4(0, 0, 0, 0), icprev=int4(0, 0, 0, 0);\n"
" int4 icrastemp = int4(0, 0, 0, 0), ickonsttemp = int4(0, 0, 0, 0);\n\n"); " int4 icrastemp = int4(0, 0, 0, 0), ickonsttemp = int4(0, 0, 0, 0);\n\n");
if (ApiType == API_OPENGL) if (ApiType == API_OPENGL)
@ -532,17 +532,17 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T
if (bpmem.combiners[numStages - 1].colorC.dest != 0) if (bpmem.combiners[numStages - 1].colorC.dest != 0)
{ {
bool retrieveFromAuxRegister = !RegisterStates[bpmem.combiners[numStages - 1].colorC.dest].ColorNeedOverflowControl && RegisterStates[bpmem.combiners[numStages - 1].colorC.dest].AuxStored; bool retrieveFromAuxRegister = !RegisterStates[bpmem.combiners[numStages - 1].colorC.dest].ColorNeedOverflowControl && RegisterStates[bpmem.combiners[numStages - 1].colorC.dest].AuxStored;
out.Write("\tprev.rgb = %s%s;\n", retrieveFromAuxRegister ? "c" : "" , tevCOutputTable[bpmem.combiners[numStages - 1].colorC.dest]); out.Write("\tiprev.rgb = %s;\n", tevCOutputTable[bpmem.combiners[numStages - 1].colorC.dest + (retrieveFromAuxRegister)?4:0]);
RegisterStates[0].ColorNeedOverflowControl = RegisterStates[bpmem.combiners[numStages - 1].colorC.dest].ColorNeedOverflowControl; RegisterStates[0].ColorNeedOverflowControl = RegisterStates[bpmem.combiners[numStages - 1].colorC.dest].ColorNeedOverflowControl;
} }
if (bpmem.combiners[numStages - 1].alphaC.dest != 0) if (bpmem.combiners[numStages - 1].alphaC.dest != 0)
{ {
bool retrieveFromAuxRegister = !RegisterStates[bpmem.combiners[numStages - 1].alphaC.dest].AlphaNeedOverflowControl && RegisterStates[bpmem.combiners[numStages - 1].alphaC.dest].AuxStored; bool retrieveFromAuxRegister = !RegisterStates[bpmem.combiners[numStages - 1].alphaC.dest].AlphaNeedOverflowControl && RegisterStates[bpmem.combiners[numStages - 1].alphaC.dest].AuxStored;
out.Write("\tprev.a = %s%s;\n", retrieveFromAuxRegister ? "c" : "" , tevAOutputTable[bpmem.combiners[numStages - 1].alphaC.dest]); out.Write("\tiprev.a = %s;\n", tevAOutputTable[bpmem.combiners[numStages - 1].alphaC.dest + (retrieveFromAuxRegister)?4:0]);
RegisterStates[0].AlphaNeedOverflowControl = RegisterStates[bpmem.combiners[numStages - 1].alphaC.dest].AlphaNeedOverflowControl; RegisterStates[0].AlphaNeedOverflowControl = RegisterStates[bpmem.combiners[numStages - 1].alphaC.dest].AlphaNeedOverflowControl;
} }
} }
out.Write("\tint4 iprev = int4(round(prev * 255.0)) & 0xFF;\n"); out.Write("\tiprev = iprev & 0xFF;\n");
AlphaTest::TEST_RESULT Pretest = bpmem.alpha_test.TestResult(); AlphaTest::TEST_RESULT Pretest = bpmem.alpha_test.TestResult();
uid_data.Pretest = Pretest; uid_data.Pretest = Pretest;
@ -862,13 +862,13 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP
{ {
if (RegisterStates[0].AlphaNeedOverflowControl || RegisterStates[0].ColorNeedOverflowControl) if (RegisterStates[0].AlphaNeedOverflowControl || RegisterStates[0].ColorNeedOverflowControl)
{ {
out.Write("cprev = frac(prev * (255.0/256.0)) * (256.0/255.0);\n"); out.Write("icprev = iprev & 0xFF;\n");
RegisterStates[0].AlphaNeedOverflowControl = false; RegisterStates[0].AlphaNeedOverflowControl = false;
RegisterStates[0].ColorNeedOverflowControl = false; RegisterStates[0].ColorNeedOverflowControl = false;
} }
else else
{ {
out.Write("cprev = prev;\n"); out.Write("icprev = iprev;\n");
} }
RegisterStates[0].AuxStored = true; RegisterStates[0].AuxStored = true;
} }
@ -882,13 +882,13 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP
out.SetConstantsUsed(C_COLORS+1,C_COLORS+1); out.SetConstantsUsed(C_COLORS+1,C_COLORS+1);
if (RegisterStates[1].AlphaNeedOverflowControl || RegisterStates[1].ColorNeedOverflowControl) if (RegisterStates[1].AlphaNeedOverflowControl || RegisterStates[1].ColorNeedOverflowControl)
{ {
out.Write("cc0 = frac(c0 * (255.0/256.0)) * (256.0/255.0);\n"); out.Write("icc0 = ic0 & 0xFF;\n");
RegisterStates[1].AlphaNeedOverflowControl = false; RegisterStates[1].AlphaNeedOverflowControl = false;
RegisterStates[1].ColorNeedOverflowControl = false; RegisterStates[1].ColorNeedOverflowControl = false;
} }
else else
{ {
out.Write("cc0 = c0;\n"); out.Write("icc0 = ic0;\n");
} }
RegisterStates[1].AuxStored = true; RegisterStates[1].AuxStored = true;
} }
@ -902,13 +902,13 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP
out.SetConstantsUsed(C_COLORS+2,C_COLORS+2); out.SetConstantsUsed(C_COLORS+2,C_COLORS+2);
if (RegisterStates[2].AlphaNeedOverflowControl || RegisterStates[2].ColorNeedOverflowControl) if (RegisterStates[2].AlphaNeedOverflowControl || RegisterStates[2].ColorNeedOverflowControl)
{ {
out.Write("cc1 = frac(c1 * (255.0/256.0)) * (256.0/255.0);\n"); out.Write("icc1 = ic1 & 0xFF;\n");
RegisterStates[2].AlphaNeedOverflowControl = false; RegisterStates[2].AlphaNeedOverflowControl = false;
RegisterStates[2].ColorNeedOverflowControl = false; RegisterStates[2].ColorNeedOverflowControl = false;
} }
else else
{ {
out.Write("cc1 = c1;\n"); out.Write("icc1 = ic1;\n");
} }
RegisterStates[2].AuxStored = true; RegisterStates[2].AuxStored = true;
} }
@ -922,13 +922,13 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP
out.SetConstantsUsed(C_COLORS+3,C_COLORS+3); out.SetConstantsUsed(C_COLORS+3,C_COLORS+3);
if (RegisterStates[3].AlphaNeedOverflowControl || RegisterStates[3].ColorNeedOverflowControl) if (RegisterStates[3].AlphaNeedOverflowControl || RegisterStates[3].ColorNeedOverflowControl)
{ {
out.Write("cc2 = frac(c2 * (255.0/256.0)) * (256.0/255.0);\n"); out.Write("icc2 = ic2 & 0xFF;\n");
RegisterStates[3].AlphaNeedOverflowControl = false; RegisterStates[3].AlphaNeedOverflowControl = false;
RegisterStates[3].ColorNeedOverflowControl = false; RegisterStates[3].ColorNeedOverflowControl = false;
} }
else else
{ {
out.Write("cc2 = c2;\n"); out.Write("icc2 = ic2;\n");
} }
RegisterStates[3].AuxStored = true; RegisterStates[3].AuxStored = true;
} }
@ -957,6 +957,8 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP
else else
out.Write("%s = ", tevCOutputTable[cc.dest]); out.Write("%s = ", tevCOutputTable[cc.dest]);
out.Write("int3(");
// combine the color channel // combine the color channel
if (cc.bias != TevBias_COMPARE) // if not compare if (cc.bias != TevBias_COMPARE) // if not compare
{ {
@ -994,8 +996,9 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP
tevCInputTable[cc.b + 16], tevCInputTable[cc.b + 16],
tevCInputTable[cc.c + 16]); tevCInputTable[cc.c + 16]);
} }
out.Write(" * 255.0f)");
if (cc.clamp) if (cc.clamp)
out.Write(", 0.0, 1.0)"); out.Write(", 0, 255)");
out.Write(";\n"); out.Write(";\n");
RegisterStates[ac.dest].AlphaNeedOverflowControl = (ac.clamp == 0); RegisterStates[ac.dest].AlphaNeedOverflowControl = (ac.clamp == 0);
@ -1007,6 +1010,8 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP
else else
out.Write("%s = ", tevAOutputTable[ac.dest]); out.Write("%s = ", tevAOutputTable[ac.dest]);
out.Write("int(");
if (ac.bias != TevBias_COMPARE) // if not compare if (ac.bias != TevBias_COMPARE) // if not compare
{ {
//normal alpha combiner goes here //normal alpha combiner goes here
@ -1043,8 +1048,9 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP
tevAInputTable[ac.b + 8], tevAInputTable[ac.b + 8],
tevAInputTable[ac.c + 8]); tevAInputTable[ac.c + 8]);
} }
out.Write(" * 255.0f)");
if (ac.clamp) if (ac.clamp)
out.Write(", 0.0, 1.0)"); out.Write(", 0, 255)");
out.Write(";\n\n"); out.Write(";\n\n");
out.Write("// TEV done\n"); out.Write("// TEV done\n");
} }