mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-13 02:08:49 +12:00
vk: Add workaround for broken format conversion in older GeForce cards
This commit is contained in:
parent
4f088a102c
commit
a6e143254a
2 changed files with 32 additions and 6 deletions
|
@ -61,7 +61,17 @@ namespace vk
|
||||||
|
|
||||||
if (!job)
|
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);
|
job->run(cmd, src, dst);
|
||||||
|
@ -122,7 +132,17 @@ namespace vk
|
||||||
|
|
||||||
if (!job)
|
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);
|
job->run(cmd, dst, src);
|
||||||
|
|
|
@ -139,11 +139,14 @@ namespace vk
|
||||||
|
|
||||||
struct cs_resolve_task : cs_resolve_base
|
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 =
|
std::string kernel =
|
||||||
" vec4 aa_sample = imageLoad(multisampled, aa_coords, sample_index);\n"
|
" 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);
|
build(kernel, format_prefix, 0);
|
||||||
}
|
}
|
||||||
|
@ -151,11 +154,14 @@ namespace vk
|
||||||
|
|
||||||
struct cs_unresolve_task : cs_resolve_base
|
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 =
|
std::string kernel =
|
||||||
" vec4 resolved_sample = imageLoad(resolve, resolve_coords);\n"
|
" 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);
|
build(kernel, format_prefix, 1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue