diff --git a/rpcs3/Emu/RSX/VK/VKResolveHelper.cpp b/rpcs3/Emu/RSX/VK/VKResolveHelper.cpp index 5fafa2142c..92a1e090d0 100644 --- a/rpcs3/Emu/RSX/VK/VKResolveHelper.cpp +++ b/rpcs3/Emu/RSX/VK/VKResolveHelper.cpp @@ -61,7 +61,17 @@ namespace vk if (!job) { - job.reset(new vk::cs_resolve_task(get_format_prefix(src->format()))); + const char* format_prefix = get_format_prefix(src->format()); + bool require_bgra_swap = false; + + if (vk::get_chip_family() == vk::chip_class::NV_kepler && + src->format() == VK_FORMAT_B8G8R8A8_UNORM) + { + // Workaround for NVIDIA kepler's broken image_load_store + require_bgra_swap = true; + } + + job.reset(new vk::cs_resolve_task(format_prefix, require_bgra_swap)); } job->run(cmd, src, dst); @@ -122,7 +132,17 @@ namespace vk if (!job) { - job.reset(new vk::cs_unresolve_task(get_format_prefix(src->format()))); + const char* format_prefix = get_format_prefix(src->format()); + bool require_bgra_swap = false; + + if (vk::get_chip_family() == vk::chip_class::NV_kepler && + src->format() == VK_FORMAT_B8G8R8A8_UNORM) + { + // Workaround for NVIDIA kepler's broken image_load_store + require_bgra_swap = true; + } + + job.reset(new vk::cs_unresolve_task(format_prefix, require_bgra_swap)); } job->run(cmd, dst, src); diff --git a/rpcs3/Emu/RSX/VK/VKResolveHelper.h b/rpcs3/Emu/RSX/VK/VKResolveHelper.h index 791fd55ed8..9951593307 100644 --- a/rpcs3/Emu/RSX/VK/VKResolveHelper.h +++ b/rpcs3/Emu/RSX/VK/VKResolveHelper.h @@ -139,11 +139,14 @@ namespace vk struct cs_resolve_task : cs_resolve_base { - cs_resolve_task(const std::string& format_prefix) + cs_resolve_task(const std::string& format_prefix, bool bgra_swap = false) { + // Allow rgba->bgra transformation for old GeForce cards + const std::string swizzle = bgra_swap? ".bgra" : ""; + std::string kernel = " vec4 aa_sample = imageLoad(multisampled, aa_coords, sample_index);\n" - " imageStore(resolve, resolve_coords, aa_sample);\n"; + " imageStore(resolve, resolve_coords, aa_sample" + swizzle + ");\n"; build(kernel, format_prefix, 0); } @@ -151,11 +154,14 @@ namespace vk struct cs_unresolve_task : cs_resolve_base { - cs_unresolve_task(const std::string& format_prefix) + cs_unresolve_task(const std::string& format_prefix, bool bgra_swap = false) { + // Allow rgba->bgra transformation for old GeForce cards + const std::string swizzle = bgra_swap? ".bgra" : ""; + std::string kernel = " vec4 resolved_sample = imageLoad(resolve, resolve_coords);\n" - " imageStore(multisampled, aa_coords, sample_index, resolved_sample);\n"; + " imageStore(multisampled, aa_coords, sample_index, resolved_sample" + swizzle + ");\n"; build(kernel, format_prefix, 1); }