Reorganize the end of the fragment shader generator.

Thanks unknown.
This commit is contained in:
Henrik Rydgård 2020-11-09 09:07:52 +01:00
parent 864cc54aa4
commit e77a9d7368
3 changed files with 18 additions and 22 deletions

View File

@ -58,8 +58,12 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) {
break;
case HLSL_D3D9:
case HLSL_D3D11:
fragColor0 = "outfragment.target";
fragColor1 = "outfragment.target1";
if (lang == HLSL_D3D11) {
fragColor0 = "outfragment.target";
fragColor1 = "outfragment.target1";
} else {
fragColor0 = "target";
}
varying_fs = "in";
varying_vs = "out";
attribute = "in";

View File

@ -427,6 +427,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu
WRITE(p, " PS_OUT outfragment;\n");
} else if (compat.shaderLanguage == HLSL_D3D9) {
WRITE(p, "vec4 main( PS_IN In ) : COLOR {\n");
WRITE(p, " vec4 target;\n");
} else {
WRITE(p, "void main() {\n");
}
@ -959,15 +960,16 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu
switch (stencilToAlpha) {
case REPLACE_ALPHA_DUALSOURCE:
// Handled at the end.
WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha);
WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", compat.fragColor1);
break;
case REPLACE_ALPHA_YES:
WRITE(p, " v.a = %s;\n", replacedAlpha);
WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha);
break;
case REPLACE_ALPHA_NO:
// Nothing to do.
WRITE(p, " %s = v;\n", compat.fragColor0);
break;
default:
@ -979,10 +981,10 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu
LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2);
switch (replaceLogicOpType) {
case LOGICOPTYPE_ONE:
WRITE(p, " v.rgb = splat3(1.0);\n");
WRITE(p, " %s.rgb = splat3(1.0);\n", compat.fragColor0);
break;
case LOGICOPTYPE_INVERT:
WRITE(p, " v.rgb = splat3(1.0) - v.rgb;\n");
WRITE(p, " %s.rgb = splat3(1.0) - %s.rgb;\n", compat.fragColor0, compat.fragColor0);
break;
case LOGICOPTYPE_NORMAL:
break;
@ -996,11 +998,11 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu
// TODO: Maybe optimize to only do math on the affected channels?
// Or .. meh.
if (colorWriteMask) {
WRITE(p, " highp uint v32 = packUnorm4x8(v);\n");
WRITE(p, " highp uint v32 = packUnorm4x8(%s);\n", compat.fragColor0);
WRITE(p, " highp uint d32 = packUnorm4x8(destColor);\n");
// Note that the mask has been flipped to the PC way - 1 means write.
WRITE(p, " v32 = (v32 & u_colorWriteMask) | (d32 & ~u_colorWriteMask);\n");
WRITE(p, " v = unpackUnorm4x8(v32);\n");
WRITE(p, " %s = unpackUnorm4x8(v32);\n", compat.fragColor0);
}
if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) {
@ -1025,17 +1027,10 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu
WRITE(p, " gl_FragDepth = gl_FragCoord.z;\n");
}
if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) {
WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha);
WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", compat.fragColor1);
} else if (compat.shaderLanguage != HLSL_D3D9) {
WRITE(p, " %s = v;\n", compat.fragColor0);
}
if (compat.shaderLanguage == HLSL_D3D11) {
WRITE(p, " return outfragment;\n");
} else if (compat.shaderLanguage == HLSL_D3D9) {
WRITE(p, " return v;\n");
WRITE(p, " return target;\n");
}
WRITE(p, "}\n");

View File

@ -352,11 +352,11 @@ bool TestShaderGenerators() {
init_glslang();
LoadD3DCompilerDynamic();
if (!TestReinterpretShaders()) {
if (!TestFragmentShaders()) {
return false;
}
if (!TestFragmentShaders()) {
if (!TestReinterpretShaders()) {
return false;
}
@ -364,8 +364,5 @@ bool TestShaderGenerators() {
return false;
}
_CrtCheckMemory();
return true;
}