mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-02-11 00:56:37 +00:00
Reorganize the end of the fragment shader generator.
Thanks unknown.
This commit is contained in:
parent
864cc54aa4
commit
e77a9d7368
@ -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";
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user