diff options
| author | iwubcode <iwubcode@users.noreply.github.com> | 2017-08-08 00:09:25 -0500 |
|---|---|---|
| committer | iwubcode <iwubcode@users.noreply.github.com> | 2017-11-17 22:11:30 -0600 |
| commit | 76b775d5be1f9228c648b8edc1f7bb9533acb471 (patch) | |
| tree | 9338abc5fe185607082546b3b73f5d483b5fdc90 /Source/Core/VideoCommon/TextureConversionShader.cpp | |
| parent | 4d13f69dc146bff6e9f1debf4f51d38e6b1e19db (diff) | |
Video Common: Add XFB decoding via the GPU
Diffstat (limited to 'Source/Core/VideoCommon/TextureConversionShader.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/TextureConversionShader.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/TextureConversionShader.cpp b/Source/Core/VideoCommon/TextureConversionShader.cpp index 04b7bb3a01..1f608651ca 100644 --- a/Source/Core/VideoCommon/TextureConversionShader.cpp +++ b/Source/Core/VideoCommon/TextureConversionShader.cpp @@ -1262,12 +1262,41 @@ static const std::map<TextureFormat, DecodingShaderInfo> s_decoding_shader_info{ vec4 norm_color = GetPaletteColorNormalized(index); imageStore(output_image, ivec3(ivec2(coords), 0), norm_color); } + )"}}, + + // We do the inverse BT.601 conversion for YCbCr to RGB + // http://www.equasys.de/colorconversion.html#YCbCr-RGBColorFormatConversion + { TextureFormat::XFB, + { BUFFER_FORMAT_RGBA8_UINT, 0, 8, 8, false, + R"( + layout(local_size_x = 8, local_size_y = 8) in; + + void main() + { + uvec2 uv = gl_GlobalInvocationID.xy; + int buffer_pos = int(u_src_offset + (uv.y * u_src_row_stride) + (uv.x / 2)); + vec4 yuyv = texelFetch(s_input_buffer, buffer_pos); + + float y = mix(yuyv.r, yuyv.b, (uv.x & 1u) == 1u); + + float yComp = 1.164 * (y - 16); + float uComp = yuyv.g - 128; + float vComp = yuyv.a - 128; + + vec4 rgb = vec4(yComp + (1.596 * vComp), + yComp - (0.813 * vComp) - (0.391 * uComp), + yComp + (2.018 * uComp), + 255.0); + vec4 rgba_norm = rgb / 255.0; + imageStore(output_image, ivec3(ivec2(uv), 0), rgba_norm); + } )"}}}; static const std::array<u32, BUFFER_FORMAT_COUNT> s_buffer_bytes_per_texel = {{ 1, // BUFFER_FORMAT_R8_UINT 2, // BUFFER_FORMAT_R16_UINT 8, // BUFFER_FORMAT_R32G32_UINT + 4, // BUFFER_FORMAT_RGBA8_UINT }}; const DecodingShaderInfo* GetDecodingShaderInfo(TextureFormat format) |
