diff options
| author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2021-10-22 19:44:10 +0200 | 
|---|---|---|
| committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2021-11-16 22:11:32 +0100 | 
| commit | 21a8ba0437989e4255b347c2b2cabbbc2a332fd3 (patch) | |
| tree | b44304762eb7ee10a6679bf0cf59615afe832da4 /src/video_core | |
| parent | 6cdfaee7b4f3f68310e9cca755482e3e6993da10 (diff) | |
Vulkan: Fix FXAA in AMD.
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_blit_screen.cpp | 42 | 
1 files changed, 40 insertions, 2 deletions
| diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp index c0abcc17a..2bed4f3c5 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp +++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp @@ -244,8 +244,35 @@ VkSemaphore VKBlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer,              .width = (up_scale * framebuffer.width) >> down_shift,              .height = (up_scale * framebuffer.height) >> down_shift,          }; -        source_image_view = *aa_image_view;          scheduler.Record([this, image_index, size, anti_alias_pass](vk::CommandBuffer cmdbuf) { +            const VkImageMemoryBarrier base_barrier{ +                .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, +                .pNext = nullptr, +                .srcAccessMask = 0, +                .dstAccessMask = 0, +                .oldLayout = VK_IMAGE_LAYOUT_GENERAL, +                .newLayout = VK_IMAGE_LAYOUT_GENERAL, +                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, +                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, +                .image = {}, +                .subresourceRange = +                    { +                        .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, +                        .baseMipLevel = 0, +                        .levelCount = 1, +                        .baseArrayLayer = 0, +                        .layerCount = 1, +                    }, +            }; + +            { +                VkImageMemoryBarrier fsr_write_barrier = base_barrier; +                fsr_write_barrier.image = *aa_image; +                fsr_write_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; +                cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, +                                       VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, fsr_write_barrier); +            } +              const f32 bg_red = Settings::values.bg_red.GetValue() / 255.0f;              const f32 bg_green = Settings::values.bg_green.GetValue() / 255.0f;              const f32 bg_blue = Settings::values.bg_blue.GetValue() / 255.0f; @@ -294,7 +321,18 @@ VkSemaphore VKBlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer,                                        aa_descriptor_sets[image_index], {});              cmdbuf.Draw(4, 1, 0, 0);              cmdbuf.EndRenderPass(); + +            { +                VkImageMemoryBarrier blit_read_barrier = base_barrier; +                blit_read_barrier.image = *aa_image; +                blit_read_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; +                blit_read_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + +                cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT , +                                       VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, blit_read_barrier); +            }          }); +        source_image_view = *aa_image_view;      }      if (fsr) { @@ -485,7 +523,7 @@ void VKBlitScreen::CreateDescriptorPool() {      const std::array<VkDescriptorPoolSize, 1> pool_sizes_aa{{          {              .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, -            .descriptorCount = static_cast<u32>(2 * image_count), +            .descriptorCount = static_cast<u32>(image_count * 2),          },      }}; | 
