summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar Marshall Mohror2021-10-22 23:09:29 -0500
committerGravatar Fernando Sahmkow2021-11-16 22:11:32 +0100
commitdcc5b4f6b005a2c89bb4e77bca4cfe8705734021 (patch)
tree8f18cc5669dfcd150e3b97eca7acb91a0738b4ba /src/video_core/renderer_vulkan
parentrenderer_vulkan/blit_image: Use generic color state on Depth to Color blits (diff)
downloadyuzu-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.cpp17
-rw-r--r--src/video_core/renderer_vulkan/vk_fsr.cpp46
-rw-r--r--src/video_core/renderer_vulkan/vk_fsr.h2
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
506void VKBlitScreen::CreateSemaphores() { 515void 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
14namespace Vulkan { 20namespace Vulkan {
15 21
16FSR::FSR(const Device& device_, MemoryAllocator& memory_allocator_, size_t image_count_, 22FSR::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
31VkImageView FSR::Draw(VKScheduler& scheduler, size_t image_index, VkImageView image_view, 37VkImageView 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
346void FSR::CreateShaders() { 359void 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
351void FSR::CreatePipeline() { 369void 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
23private: 23private:
24 void CreateDescriptorPool(); 24 void CreateDescriptorPool();