summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/TextureConversionShader.cpp
diff options
context:
space:
mode:
authoriwubcode <iwubcode@users.noreply.github.com>2017-05-29 17:02:09 -0500
committeriwubcode <iwubcode@users.noreply.github.com>2017-11-17 19:47:56 -0600
commit79387dddb24ddf035b70cd9379a42368dcd49e93 (patch)
tree7b783c46e1ffd052842f11112f58c61993f0af1b /Source/Core/VideoCommon/TextureConversionShader.cpp
parent84ca9a4aec0048e5ac01caea8f8be9210eb947f6 (diff)
Add support for hybrid XFB
Diffstat (limited to 'Source/Core/VideoCommon/TextureConversionShader.cpp')
-rw-r--r--Source/Core/VideoCommon/TextureConversionShader.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/TextureConversionShader.cpp b/Source/Core/VideoCommon/TextureConversionShader.cpp
index ab1b284b78..74e50cd27f 100644
--- a/Source/Core/VideoCommon/TextureConversionShader.cpp
+++ b/Source/Core/VideoCommon/TextureConversionShader.cpp
@@ -49,6 +49,8 @@ u16 GetEncodedSampleCount(EFBCopyFormat format)
case EFBCopyFormat::RG8:
case EFBCopyFormat::GB8:
return 2;
+ case EFBCopyFormat::XFB:
+ return 2;
default:
PanicAlert("Invalid EFB Copy Format (0x%X)! (GetEncodedSampleCount)", static_cast<int>(format));
return 1;
@@ -656,6 +658,28 @@ static void WriteZ24Encoder(char*& p, APIType ApiType, const EFBCopyParams& para
WriteEncoderEnd(p);
}
+static void WriteXFBEncoder(char*& p, APIType ApiType, const EFBCopyParams& params)
+{
+ WriteSwizzler(p, EFBCopyFormat::XFB, ApiType);
+
+ WRITE(p, " float3 y_const = float3(0.257, 0.504, 0.098);\n");
+ WRITE(p, " float3 u_const = float3(-0.148, -0.291, 0.439);\n");
+ WRITE(p, " float3 v_const = float3(0.439, -0.368, -0.071);\n");
+ WRITE(p, " float3 color0;\n");
+ WRITE(p, " float3 color1;\n");
+
+ WriteSampleColor(p, "rgb", "color0", 0, ApiType, params);
+ WriteSampleColor(p, "rgb", "color1", 1, ApiType, params);
+ WRITE(p, " float3 average = (color0 + color1) * 0.5;\n");
+
+ WRITE(p, " ocol0.b = dot(color0, y_const) + 0.0625;\n");
+ WRITE(p, " ocol0.g = dot(average, u_const) + 0.5;\n");
+ WRITE(p, " ocol0.r = dot(color1, y_const) + 0.0625;\n");
+ WRITE(p, " ocol0.a = dot(average, v_const) + 0.5;\n");
+
+ WriteEncoderEnd(p);
+}
+
const char* GenerateEncodingShader(const EFBCopyParams& params, APIType api_type)
{
text[sizeof(text) - 1] = 0x7C; // canary
@@ -728,6 +752,9 @@ const char* GenerateEncodingShader(const EFBCopyParams& params, APIType api_type
else
WriteCC8Encoder(p, "gb", api_type, params);
break;
+ case EFBCopyFormat::XFB:
+ WriteXFBEncoder(p, api_type, params);
+ break;
default:
PanicAlert("Invalid EFB Copy Format (0x%X)! (GenerateEncodingShader)",
static_cast<int>(params.copy_format));