Skip to content

Commit

Permalink
Merge pull request #7832 from stenzek/xfb-decoding-regression
Browse files Browse the repository at this point in the history
TextureCache: Fix GPU decoding of XFB copies
  • Loading branch information
Tilka committed Feb 28, 2019
2 parents f220dc7 + 8192c0d commit 6be3542
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 10 deletions.
2 changes: 1 addition & 1 deletion Source/Core/VideoBackends/D3D/VertexManager.cpp
Expand Up @@ -108,7 +108,7 @@ bool VertexManager::Initialize()
format_mapping = {{ format_mapping = {{
{TEXEL_BUFFER_FORMAT_R8_UINT, DXGI_FORMAT_R8_UINT}, {TEXEL_BUFFER_FORMAT_R8_UINT, DXGI_FORMAT_R8_UINT},
{TEXEL_BUFFER_FORMAT_R16_UINT, DXGI_FORMAT_R16_UINT}, {TEXEL_BUFFER_FORMAT_R16_UINT, DXGI_FORMAT_R16_UINT},
{TEXEL_BUFFER_FORMAT_RGBA8_UINT, DXGI_FORMAT_R8G8B8A8_UNORM}, {TEXEL_BUFFER_FORMAT_RGBA8_UINT, DXGI_FORMAT_R8G8B8A8_UINT},
{TEXEL_BUFFER_FORMAT_R32G32_UINT, DXGI_FORMAT_R32G32_UINT}, {TEXEL_BUFFER_FORMAT_R32G32_UINT, DXGI_FORMAT_R32G32_UINT},
}}; }};
for (const auto& it : format_mapping) for (const auto& it : format_mapping)
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoBackends/OGL/VertexManager.cpp
Expand Up @@ -75,7 +75,7 @@ bool VertexManager::Initialize()
format_mapping = {{ format_mapping = {{
{TEXEL_BUFFER_FORMAT_R8_UINT, GL_R8UI}, {TEXEL_BUFFER_FORMAT_R8_UINT, GL_R8UI},
{TEXEL_BUFFER_FORMAT_R16_UINT, GL_R16UI}, {TEXEL_BUFFER_FORMAT_R16_UINT, GL_R16UI},
{TEXEL_BUFFER_FORMAT_RGBA8_UINT, GL_RGBA8}, {TEXEL_BUFFER_FORMAT_RGBA8_UINT, GL_RGBA8UI},
{TEXEL_BUFFER_FORMAT_R32G32_UINT, GL_RG32UI}, {TEXEL_BUFFER_FORMAT_R32G32_UINT, GL_RG32UI},
}}; }};
glGenTextures(static_cast<GLsizei>(m_texel_buffer_views.size()), m_texel_buffer_views.data()); glGenTextures(static_cast<GLsizei>(m_texel_buffer_views.size()), m_texel_buffer_views.data());
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoBackends/Vulkan/VertexManager.cpp
Expand Up @@ -101,7 +101,7 @@ bool VertexManager::Initialize()
format_mapping = {{ format_mapping = {{
{TEXEL_BUFFER_FORMAT_R8_UINT, VK_FORMAT_R8_UINT}, {TEXEL_BUFFER_FORMAT_R8_UINT, VK_FORMAT_R8_UINT},
{TEXEL_BUFFER_FORMAT_R16_UINT, VK_FORMAT_R16_UINT}, {TEXEL_BUFFER_FORMAT_R16_UINT, VK_FORMAT_R16_UINT},
{TEXEL_BUFFER_FORMAT_RGBA8_UINT, VK_FORMAT_R8G8B8A8_UNORM}, {TEXEL_BUFFER_FORMAT_RGBA8_UINT, VK_FORMAT_R8G8B8A8_UINT},
{TEXEL_BUFFER_FORMAT_R32G32_UINT, VK_FORMAT_R32G32_UINT}, {TEXEL_BUFFER_FORMAT_R32G32_UINT, VK_FORMAT_R32G32_UINT},
}}; }};
for (const auto& it : format_mapping) for (const auto& it : format_mapping)
Expand Down
12 changes: 6 additions & 6 deletions Source/Core/VideoCommon/TextureCacheBase.cpp
Expand Up @@ -1593,12 +1593,12 @@ void TextureCacheBase::LoadTextureLevelZeroFromMemory(TCacheEntry* entry_to_upda
const u8* tlut = &texMem[tex_info.tlut_address]; const u8* tlut = &texMem[tex_info.tlut_address];


if (!decode_on_gpu || if (!decode_on_gpu ||
DecodeTextureOnGPU(entry_to_update, 0, tex_info.src_data, tex_info.total_bytes, !DecodeTextureOnGPU(entry_to_update, 0, tex_info.src_data, tex_info.total_bytes,
tex_info.full_format.texfmt, tex_info.native_width, tex_info.native_height, tex_info.full_format.texfmt, tex_info.native_width,
tex_info.expanded_width, tex_info.expanded_height, tex_info.native_height, tex_info.expanded_width, tex_info.expanded_height,
tex_info.bytes_per_block * tex_info.bytes_per_block *
(tex_info.expanded_width / tex_info.block_width), (tex_info.expanded_width / tex_info.block_width),
tlut, tex_info.full_format.tlutfmt)) tlut, tex_info.full_format.tlutfmt))
{ {
size_t decoded_texture_size = tex_info.expanded_width * sizeof(u32) * tex_info.expanded_height; size_t decoded_texture_size = tex_info.expanded_width * sizeof(u32) * tex_info.expanded_height;
CheckTempSize(decoded_texture_size); CheckTempSize(decoded_texture_size);
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoCommon/TextureConversionShader.cpp
Expand Up @@ -1345,7 +1345,7 @@ static const std::map<TextureFormat, DecodingShaderInfo> s_decoding_shader_info{
int buffer_pos = int(u_src_offset + (uv.y * u_src_row_stride) + (uv.x / 2u)); int buffer_pos = int(u_src_offset + (uv.y * u_src_row_stride) + (uv.x / 2u));
float4 yuyv = float4(texelFetch(s_input_buffer, buffer_pos)); float4 yuyv = float4(texelFetch(s_input_buffer, buffer_pos));
float y = mix(yuyv.r, yuyv.b, (uv.x & 1u) == 1u); float y = (uv.x & 1u) != 0u ? yuyv.r : yuyv.g;
float yComp = 1.164 * (y - 16.0); float yComp = 1.164 * (y - 16.0);
float uComp = yuyv.g - 128.0; float uComp = yuyv.g - 128.0;
Expand Down

0 comments on commit 6be3542

Please sign in to comment.