From d0601c0a8372780ae3412d25bf81561d23e89ac1 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 6 Dec 2017 03:08:35 +1000 Subject: [PATCH] TextureConversionShader: Use round() instead of roundEven() in HLSL HLSL does not define roundEven(), only round(). This means that the output may differ slightly for OpenGL vs Direct3D. However, it ensures consistency across OpenGL drivers, as round() in GLSL can go either way. --- Source/Core/VideoCommon/TextureConversionShader.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Source/Core/VideoCommon/TextureConversionShader.cpp b/Source/Core/VideoCommon/TextureConversionShader.cpp index 044e3a4868..9535ccc88b 100644 --- a/Source/Core/VideoCommon/TextureConversionShader.cpp +++ b/Source/Core/VideoCommon/TextureConversionShader.cpp @@ -72,6 +72,12 @@ static void WriteSwizzler(char*& p, EFBCopyFormat format, APIType ApiType) WRITE(p, "uniform float y_scale;\n"); } + // D3D does not have roundEven(), only round(), which is specified "to the nearest integer". + // This differs from the roundEven() behavior, but to get consistency across drivers in OpenGL + // we need to use roundEven(). + if (ApiType == APIType::D3D) + WRITE(p, "#define roundEven(x) round(x)\n"); + // Alpha channel in the copy is set to 1 the EFB format does not have an alpha channel. WRITE(p, "float4 RGBA8ToRGB8(float4 src)\n"); WRITE(p, "{\n");