aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan/present/layer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/renderer_vulkan/present/layer.cpp')
-rw-r--r--src/video_core/renderer_vulkan/present/layer.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp
index 14935f92bb..1868142f51 100644
--- a/src/video_core/renderer_vulkan/present/layer.cpp
+++ b/src/video_core/renderer_vulkan/present/layer.cpp
@@ -18,6 +18,10 @@
#include "video_core/renderer_vulkan/present/sgsr.h"
#include "video_core/renderer_vulkan/present/fxaa.h"
#include "video_core/renderer_vulkan/present/layer.h"
+#ifdef HAS_RESHADE
+#include "video_core/post_processing/fx_chain.h"
+#include "video_core/renderer_vulkan/present/post_process.h"
+#endif
#include "video_core/renderer_vulkan/present/present_push_constants.h"
#include "video_core/renderer_vulkan/present/smaa.h"
#include "video_core/renderer_vulkan/present/util.h"
@@ -93,6 +97,9 @@ void Layer::ConfigureDraw(const Device& device, PresentPushConstants* out_push_c
RefreshResources(device, framebuffer);
SetAntiAliasPass(device);
+#ifdef HAS_RESHADE
+ SetPostProcessPass(device);
+#endif
// Finish any pending renderpass
scheduler.RequestOutsideRenderPassOperationContext();
@@ -115,6 +122,12 @@ void Layer::ConfigureDraw(const Device& device, PresentPushConstants* out_push_c
smaa->Draw(device, scheduler, image_index, &source_image, &source_image_view);
}
+#ifdef HAS_RESHADE
+ if (post_process.has_value()) {
+ post_process->Draw(device, scheduler, image_index, &source_image, &source_image_view);
+ }
+#endif
+
auto crop_rect = Tegra::NormalizeCrop(framebuffer, texture_width, texture_height);
const VkExtent2D render_extent{
.width = scaled_width,
@@ -214,6 +227,43 @@ void Layer::SetAntiAliasPass(const Device& device) {
}
}
+#ifdef HAS_RESHADE
+void Layer::SetPostProcessPass(const Device& device) {
+ const VkExtent2D render_area{
+ .width = Settings::values.resolution_info.ScaleUp(raw_width),
+ .height = Settings::values.resolution_info.ScaleUp(raw_height),
+ };
+
+ const u64 generation = VideoCore::FxChain::Instance().Snapshot().generation;
+ const bool enabled = Settings::values.post_shader_enabled.GetValue();
+
+ if (post_process_generation == generation && post_process_enabled == enabled &&
+ post_process_extent.width == render_area.width &&
+ post_process_extent.height == render_area.height) {
+ return;
+ }
+
+ for (const u64 tick : resource_ticks) {
+ scheduler.Wait(tick);
+ }
+
+ post_process_generation = generation;
+ post_process_enabled = enabled;
+ post_process_extent = render_area;
+ post_process.reset();
+
+ if (!enabled || VideoCore::FxChain::Instance().Size() == 0) {
+ return;
+ }
+
+ post_process.emplace(device, memory_allocator, scheduler, image_count, render_area);
+
+ if (post_process->Empty()) {
+ post_process.reset();
+ }
+}
+#endif
+
void Layer::ReleaseRawImages() {
for (const u64 tick : resource_ticks) {
scheduler.Wait(tick);