diff options
| author | 2021-10-22 23:09:29 -0500 | |
|---|---|---|
| committer | 2021-11-16 22:11:32 +0100 | |
| commit | dcc5b4f6b005a2c89bb4e77bca4cfe8705734021 (patch) | |
| tree | 8f18cc5669dfcd150e3b97eca7acb91a0738b4ba /src/video_core/renderer_vulkan | |
| parent | renderer_vulkan/blit_image: Use generic color state on Depth to Color blits (diff) | |
| download | yuzu-dcc5b4f6b005a2c89bb4e77bca4cfe8705734021.tar.gz yuzu-dcc5b4f6b005a2c89bb4e77bca4cfe8705734021.tar.xz yuzu-dcc5b4f6b005a2c89bb4e77bca4cfe8705734021.zip | |
Presentation: Only use FP16 in scaling shaders on supported devices in Vulkan
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_blit_screen.cpp | 17 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_fsr.cpp | 46 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_fsr.h | 2 |
3 files changed, 46 insertions, 19 deletions
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp index 2bed4f3c5..9dfc508bc 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp +++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp | |||
| @@ -21,8 +21,9 @@ | |||
| 21 | #include "video_core/host_shaders/fxaa_vert_spv.h" | 21 | #include "video_core/host_shaders/fxaa_vert_spv.h" |
| 22 | #include "video_core/host_shaders/present_bicubic_frag_spv.h" | 22 | #include "video_core/host_shaders/present_bicubic_frag_spv.h" |
| 23 | #include "video_core/host_shaders/present_gaussian_frag_spv.h" | 23 | #include "video_core/host_shaders/present_gaussian_frag_spv.h" |
| 24 | #include "video_core/host_shaders/present_scaleforce_frag_spv.h" | ||
| 25 | #include "video_core/host_shaders/vulkan_present_frag_spv.h" | 24 | #include "video_core/host_shaders/vulkan_present_frag_spv.h" |
| 25 | #include "video_core/host_shaders/vulkan_present_scaleforce_fp16_frag_spv.h" | ||
| 26 | #include "video_core/host_shaders/vulkan_present_scaleforce_fp32_frag_spv.h" | ||
| 26 | #include "video_core/host_shaders/vulkan_present_vert_spv.h" | 27 | #include "video_core/host_shaders/vulkan_present_vert_spv.h" |
| 27 | #include "video_core/renderer_vulkan/renderer_vulkan.h" | 28 | #include "video_core/renderer_vulkan/renderer_vulkan.h" |
| 28 | #include "video_core/renderer_vulkan/vk_blit_screen.h" | 29 | #include "video_core/renderer_vulkan/vk_blit_screen.h" |
| @@ -328,7 +329,7 @@ VkSemaphore VKBlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer, | |||
| 328 | blit_read_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; | 329 | blit_read_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| 329 | blit_read_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; | 330 | blit_read_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; |
| 330 | 331 | ||
| 331 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT , | 332 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
| 332 | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, blit_read_barrier); | 333 | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, blit_read_barrier); |
| 333 | } | 334 | } |
| 334 | }); | 335 | }); |
| @@ -344,8 +345,12 @@ VkSemaphore VKBlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer, | |||
| 344 | crop_rect.bottom = framebuffer.height; | 345 | crop_rect.bottom = framebuffer.height; |
| 345 | } | 346 | } |
| 346 | crop_rect = crop_rect.Scale(Settings::values.resolution_info.up_factor); | 347 | crop_rect = crop_rect.Scale(Settings::values.resolution_info.up_factor); |
| 348 | VkExtent2D fsr_input_size{ | ||
| 349 | .width = Settings::values.resolution_info.ScaleUp(framebuffer.width), | ||
| 350 | .height = Settings::values.resolution_info.ScaleUp(framebuffer.height), | ||
| 351 | }; | ||
| 347 | VkImageView fsr_image_view = | 352 | VkImageView fsr_image_view = |
| 348 | fsr->Draw(scheduler, image_index, source_image_view, crop_rect); | 353 | fsr->Draw(scheduler, image_index, source_image_view, fsr_input_size, crop_rect); |
| 349 | UpdateDescriptorSet(image_index, fsr_image_view, true); | 354 | UpdateDescriptorSet(image_index, fsr_image_view, true); |
| 350 | } else { | 355 | } else { |
| 351 | const bool is_nn = | 356 | const bool is_nn = |
| @@ -500,7 +505,11 @@ void VKBlitScreen::CreateShaders() { | |||
| 500 | bilinear_fragment_shader = BuildShader(device, VULKAN_PRESENT_FRAG_SPV); | 505 | bilinear_fragment_shader = BuildShader(device, VULKAN_PRESENT_FRAG_SPV); |
| 501 | bicubic_fragment_shader = BuildShader(device, PRESENT_BICUBIC_FRAG_SPV); | 506 | bicubic_fragment_shader = BuildShader(device, PRESENT_BICUBIC_FRAG_SPV); |
| 502 | gaussian_fragment_shader = BuildShader(device, PRESENT_GAUSSIAN_FRAG_SPV); | 507 | gaussian_fragment_shader = BuildShader(device, PRESENT_GAUSSIAN_FRAG_SPV); |
| 503 | scaleforce_fragment_shader = BuildShader(device, PRESENT_SCALEFORCE_FRAG_SPV); | 508 | if (device.IsFloat16Supported()) { |
| 509 | scaleforce_fragment_shader = BuildShader(device, VULKAN_PRESENT_SCALEFORCE_FP16_FRAG_SPV); | ||
| 510 | } else { | ||
| 511 | scaleforce_fragment_shader = BuildShader(device, VULKAN_PRESENT_SCALEFORCE_FP32_FRAG_SPV); | ||
| 512 | } | ||
| 504 | } | 513 | } |
| 505 | 514 | ||
| 506 | void VKBlitScreen::CreateSemaphores() { | 515 | void VKBlitScreen::CreateSemaphores() { |
diff --git a/src/video_core/renderer_vulkan/vk_fsr.cpp b/src/video_core/renderer_vulkan/vk_fsr.cpp index 1f60974be..9288aa7c2 100644 --- a/src/video_core/renderer_vulkan/vk_fsr.cpp +++ b/src/video_core/renderer_vulkan/vk_fsr.cpp | |||
| @@ -4,13 +4,19 @@ | |||
| 4 | 4 | ||
| 5 | #include "common/common_types.h" | 5 | #include "common/common_types.h" |
| 6 | #include "common/div_ceil.h" | 6 | #include "common/div_ceil.h" |
| 7 | #include "video_core/host_shaders/vulkan_fidelityfx_fsr_easu_comp_spv.h" | 7 | #include "video_core/host_shaders/vulkan_fidelityfx_fsr_easu_fp16_comp_spv.h" |
| 8 | #include "video_core/host_shaders/vulkan_fidelityfx_fsr_rcas_comp_spv.h" | 8 | #include "video_core/host_shaders/vulkan_fidelityfx_fsr_easu_fp32_comp_spv.h" |
| 9 | #include "video_core/host_shaders/vulkan_fidelityfx_fsr_rcas_fp16_comp_spv.h" | ||
| 10 | #include "video_core/host_shaders/vulkan_fidelityfx_fsr_rcas_fp32_comp_spv.h" | ||
| 9 | #include "video_core/renderer_vulkan/vk_fsr.h" | 11 | #include "video_core/renderer_vulkan/vk_fsr.h" |
| 10 | #include "video_core/renderer_vulkan/vk_scheduler.h" | 12 | #include "video_core/renderer_vulkan/vk_scheduler.h" |
| 11 | #include "video_core/renderer_vulkan/vk_shader_util.h" | 13 | #include "video_core/renderer_vulkan/vk_shader_util.h" |
| 12 | #include "video_core/vulkan_common/vulkan_device.h" | 14 | #include "video_core/vulkan_common/vulkan_device.h" |
| 13 | 15 | ||
| 16 | #define A_CPU | ||
| 17 | #include <ffx_a.h> | ||
| 18 | #include <ffx_fsr1.h> | ||
| 19 | |||
| 14 | namespace Vulkan { | 20 | namespace Vulkan { |
| 15 | 21 | ||
| 16 | FSR::FSR(const Device& device_, MemoryAllocator& memory_allocator_, size_t image_count_, | 22 | FSR::FSR(const Device& device_, MemoryAllocator& memory_allocator_, size_t image_count_, |
| @@ -29,11 +35,11 @@ FSR::FSR(const Device& device_, MemoryAllocator& memory_allocator_, size_t image | |||
| 29 | } | 35 | } |
| 30 | 36 | ||
| 31 | VkImageView FSR::Draw(VKScheduler& scheduler, size_t image_index, VkImageView image_view, | 37 | VkImageView FSR::Draw(VKScheduler& scheduler, size_t image_index, VkImageView image_view, |
| 32 | const Common::Rectangle<int>& crop_rect) { | 38 | VkExtent2D input_image_extent, const Common::Rectangle<int>& crop_rect) { |
| 33 | 39 | ||
| 34 | UpdateDescriptorSet(image_index, image_view); | 40 | UpdateDescriptorSet(image_index, image_view); |
| 35 | 41 | ||
| 36 | scheduler.Record([this, image_index, crop_rect](vk::CommandBuffer cmdbuf) { | 42 | scheduler.Record([this, image_index, input_image_extent, crop_rect](vk::CommandBuffer cmdbuf) { |
| 37 | const VkImageMemoryBarrier base_barrier{ | 43 | const VkImageMemoryBarrier base_barrier{ |
| 38 | .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, | 44 | .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, |
| 39 | .pNext = nullptr, | 45 | .pNext = nullptr, |
| @@ -54,13 +60,18 @@ VkImageView FSR::Draw(VKScheduler& scheduler, size_t image_index, VkImageView im | |||
| 54 | }, | 60 | }, |
| 55 | }; | 61 | }; |
| 56 | 62 | ||
| 57 | // TODO: Support clear color | ||
| 58 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *easu_pipeline); | 63 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *easu_pipeline); |
| 59 | cmdbuf.PushConstants(*pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT, | 64 | |
| 60 | VkExtent2D{ | 65 | std::array<AU1, 4 * 4> push_constants; |
| 61 | .width = static_cast<u32>(crop_rect.GetWidth()), | 66 | FsrEasuConOffset( |
| 62 | .height = static_cast<u32>(crop_rect.GetHeight()), | 67 | push_constants.data() + 0, push_constants.data() + 4, push_constants.data() + 8, |
| 63 | }); | 68 | push_constants.data() + 12, |
| 69 | |||
| 70 | static_cast<AF1>(crop_rect.GetWidth()), static_cast<AF1>(crop_rect.GetHeight()), | ||
| 71 | static_cast<AF1>(input_image_extent.width), static_cast<AF1>(input_image_extent.height), | ||
| 72 | static_cast<AF1>(output_size.width), static_cast<AF1>(output_size.height), | ||
| 73 | static_cast<AF1>(crop_rect.left), static_cast<AF1>(crop_rect.top)); | ||
| 74 | cmdbuf.PushConstants(*pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT, push_constants); | ||
| 64 | 75 | ||
| 65 | { | 76 | { |
| 66 | VkImageMemoryBarrier fsr_write_barrier = base_barrier; | 77 | VkImageMemoryBarrier fsr_write_barrier = base_barrier; |
| @@ -77,7 +88,9 @@ VkImageView FSR::Draw(VKScheduler& scheduler, size_t image_index, VkImageView im | |||
| 77 | Common::DivCeil(output_size.height, 16u), 1); | 88 | Common::DivCeil(output_size.height, 16u), 1); |
| 78 | 89 | ||
| 79 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *rcas_pipeline); | 90 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *rcas_pipeline); |
| 80 | cmdbuf.PushConstants(*pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT, output_size); | 91 | |
| 92 | FsrRcasCon(push_constants.data(), 0.25f); | ||
| 93 | cmdbuf.PushConstants(*pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT, push_constants); | ||
| 81 | 94 | ||
| 82 | { | 95 | { |
| 83 | std::array<VkImageMemoryBarrier, 2> barriers; | 96 | std::array<VkImageMemoryBarrier, 2> barriers; |
| @@ -247,7 +260,7 @@ void FSR::CreatePipelineLayout() { | |||
| 247 | VkPushConstantRange push_const{ | 260 | VkPushConstantRange push_const{ |
| 248 | .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, | 261 | .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, |
| 249 | .offset = 0, | 262 | .offset = 0, |
| 250 | .size = sizeof(std::array<u32, 2>), | 263 | .size = sizeof(std::array<u32, 4 * 4>), |
| 251 | }; | 264 | }; |
| 252 | VkPipelineLayoutCreateInfo ci{ | 265 | VkPipelineLayoutCreateInfo ci{ |
| 253 | .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, | 266 | .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, |
| @@ -344,8 +357,13 @@ void FSR::CreateSampler() { | |||
| 344 | } | 357 | } |
| 345 | 358 | ||
| 346 | void FSR::CreateShaders() { | 359 | void FSR::CreateShaders() { |
| 347 | easu_shader = BuildShader(device, VULKAN_FIDELITYFX_FSR_EASU_COMP_SPV); | 360 | if (device.IsFloat16Supported()) { |
| 348 | rcas_shader = BuildShader(device, VULKAN_FIDELITYFX_FSR_RCAS_COMP_SPV); | 361 | easu_shader = BuildShader(device, VULKAN_FIDELITYFX_FSR_EASU_FP16_COMP_SPV); |
| 362 | rcas_shader = BuildShader(device, VULKAN_FIDELITYFX_FSR_RCAS_FP16_COMP_SPV); | ||
| 363 | } else { | ||
| 364 | easu_shader = BuildShader(device, VULKAN_FIDELITYFX_FSR_EASU_FP32_COMP_SPV); | ||
| 365 | rcas_shader = BuildShader(device, VULKAN_FIDELITYFX_FSR_RCAS_FP32_COMP_SPV); | ||
| 366 | } | ||
| 349 | } | 367 | } |
| 350 | 368 | ||
| 351 | void FSR::CreatePipeline() { | 369 | void FSR::CreatePipeline() { |
diff --git a/src/video_core/renderer_vulkan/vk_fsr.h b/src/video_core/renderer_vulkan/vk_fsr.h index 8391e2e58..6bbec3d36 100644 --- a/src/video_core/renderer_vulkan/vk_fsr.h +++ b/src/video_core/renderer_vulkan/vk_fsr.h | |||
| @@ -18,7 +18,7 @@ public: | |||
| 18 | explicit FSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, | 18 | explicit FSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, |
| 19 | VkExtent2D output_size); | 19 | VkExtent2D output_size); |
| 20 | VkImageView Draw(VKScheduler& scheduler, size_t image_index, VkImageView image_view, | 20 | VkImageView Draw(VKScheduler& scheduler, size_t image_index, VkImageView image_view, |
| 21 | const Common::Rectangle<int>& crop_rect); | 21 | VkExtent2D input_image_extent, const Common::Rectangle<int>& crop_rect); |
| 22 | 22 | ||
| 23 | private: | 23 | private: |
| 24 | void CreateDescriptorPool(); | 24 | void CreateDescriptorPool(); |