summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/TextureConversionShader.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2017-12-06 03:08:35 +1000
committerStenzek <stenzek@gmail.com>2017-12-06 03:33:50 +1000
commitd0601c0a8372780ae3412d25bf81561d23e89ac1 (patch)
tree49a457a6d93769a0efe384bcd17befec29966376 /Source/Core/VideoCommon/TextureConversionShader.cpp
parente0ffce27854e179025f98542ba2d4843f1e2161c (diff)
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.
Diffstat (limited to 'Source/Core/VideoCommon/TextureConversionShader.cpp')
-rw-r--r--Source/Core/VideoCommon/TextureConversionShader.cpp6
1 files changed, 6 insertions, 0 deletions
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");