Fernando Sahmkow 4 лет назад
Родитель
Сommit
21a8ba0437
1 измененных файлов с 40 добавлено и 2 удалено
  1. 40 2
      src/video_core/renderer_vulkan/vk_blit_screen.cpp

+ 40 - 2
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),
         },
     }};