GPU: Work around nearest sampling issues on AMD
Fixes one-line flickering display in some games.
This commit is contained in:
parent
d8cd32d964
commit
6af71beed5
|
@ -1683,13 +1683,13 @@ bool GPU::CompileDisplayPipelines(bool display, bool deinterlace, bool chroma_sm
|
||||||
|
|
||||||
case DisplayScalingMode::BilinearSmooth:
|
case DisplayScalingMode::BilinearSmooth:
|
||||||
case DisplayScalingMode::BilinearInteger:
|
case DisplayScalingMode::BilinearInteger:
|
||||||
fs = shadergen.GenerateDisplayFragmentShader(true);
|
fs = shadergen.GenerateDisplayFragmentShader(true, false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DisplayScalingMode::Nearest:
|
case DisplayScalingMode::Nearest:
|
||||||
case DisplayScalingMode::NearestInteger:
|
case DisplayScalingMode::NearestInteger:
|
||||||
default:
|
default:
|
||||||
fs = shadergen.GenerateDisplayFragmentShader(false);
|
fs = shadergen.GenerateDisplayFragmentShader(false, true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,17 +48,27 @@ std::string GPUShaderGen::GenerateDisplayVertexShader()
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GPUShaderGen::GenerateDisplayFragmentShader(bool clamp_uv)
|
std::string GPUShaderGen::GenerateDisplayFragmentShader(bool clamp_uv, bool nearest)
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
WriteHeader(ss);
|
WriteHeader(ss);
|
||||||
WriteDisplayUniformBuffer(ss);
|
WriteDisplayUniformBuffer(ss);
|
||||||
DeclareTexture(ss, "samp0", 0);
|
DeclareTexture(ss, "samp0", 0);
|
||||||
DeclareFragmentEntryPoint(ss, 0, 1);
|
DeclareFragmentEntryPoint(ss, 0, 1);
|
||||||
|
ss << "{\n";
|
||||||
|
|
||||||
if (clamp_uv)
|
if (clamp_uv)
|
||||||
ss << "{\n o_col0 = float4(SAMPLE_TEXTURE(samp0, ClampUV(v_tex0)).rgb, 1.0f);\n }";
|
ss << " float2 uv = ClampUV(v_tex0);\n";
|
||||||
else
|
else
|
||||||
ss << "{\n o_col0 = float4(SAMPLE_TEXTURE(samp0, v_tex0).rgb, 1.0f);\n }";
|
ss << " float2 uv = v_tex0;\n";
|
||||||
|
|
||||||
|
// Work around nearest sampling precision issues on AMD graphics cards by adding 1/128 to UVs.
|
||||||
|
if (nearest)
|
||||||
|
ss << " o_col0 = float4(LOAD_TEXTURE(samp0, int2((uv * u_src_size.xy) + (1.0 / 128.0)), 0).rgb, 1.0f);\n";
|
||||||
|
else
|
||||||
|
ss << " o_col0 = float4(SAMPLE_TEXTURE(samp0, ClampUV(v_tex0)).rgb, 1.0f);\n";
|
||||||
|
|
||||||
|
ss << "}\n";
|
||||||
|
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ public:
|
||||||
~GPUShaderGen();
|
~GPUShaderGen();
|
||||||
|
|
||||||
std::string GenerateDisplayVertexShader();
|
std::string GenerateDisplayVertexShader();
|
||||||
std::string GenerateDisplayFragmentShader(bool clamp_uv);
|
std::string GenerateDisplayFragmentShader(bool clamp_uv, bool nearest);
|
||||||
std::string GenerateDisplaySharpBilinearFragmentShader();
|
std::string GenerateDisplaySharpBilinearFragmentShader();
|
||||||
|
|
||||||
std::string GenerateInterleavedFieldExtractFragmentShader();
|
std::string GenerateInterleavedFieldExtractFragmentShader();
|
||||||
|
|
Loading…
Reference in New Issue