vk: Add workaround for broken format conversion in older GeForce cards

This commit is contained in:
kd-11 2019-10-15 17:35:47 +03:00 committed by kd-11
parent 4f088a102c
commit a6e143254a
2 changed files with 32 additions and 6 deletions

View file

@ -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);

View file

@ -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);
}