From f79863d0c9599877fc5e46edbcd71a1d51e5f4c2 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Thu, 1 Aug 2024 22:01:42 +1000 Subject: [PATCH] TEST: GPU: Include padded/DAC-inactive area in postfx final_rect --- src/core/gpu.cpp | 22 +++++++++++++++------- src/core/gpu.h | 10 +++++----- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/core/gpu.cpp b/src/core/gpu.cpp index 6822c268e..50f3fd983 100644 --- a/src/core/gpu.cpp +++ b/src/core/gpu.cpp @@ -1942,12 +1942,13 @@ bool GPU::PresentDisplay() { FlushRender(); + GSVector4i padded_draw_rect; const GSVector4i draw_rect = CalculateDrawRect(g_gpu_device->GetWindowWidth(), g_gpu_device->GetWindowHeight(), - !g_settings.debugging.show_vram, true); - return RenderDisplay(nullptr, draw_rect, !g_settings.debugging.show_vram); + !g_settings.debugging.show_vram, true, &padded_draw_rect); + return RenderDisplay(nullptr, draw_rect, padded_draw_rect, !g_settings.debugging.show_vram); } -bool GPU::RenderDisplay(GPUTexture* target, const GSVector4i draw_rect, bool postfx) +bool GPU::RenderDisplay(GPUTexture* target, const GSVector4i draw_rect, const GSVector4i padded_draw_rect, bool postfx) { GL_SCOPE_FMT("RenderDisplay: {}", draw_rect); @@ -2106,7 +2107,7 @@ bool GPU::RenderDisplay(GPUTexture* target, const GSVector4i draw_rect, bool pos const s32 orig_height = static_cast(std::ceil(static_cast(m_crtc_state.display_height) * upscale_y)); return PostProcessing::DisplayChain.Apply(PostProcessing::DisplayChain.GetInputTexture(), nullptr, target, - real_draw_rect, orig_width, orig_height, m_crtc_state.display_width, + padded_draw_rect, orig_width, orig_height, m_crtc_state.display_width, m_crtc_state.display_height); } else @@ -2340,8 +2341,8 @@ bool GPU::ApplyChromaSmoothing() return true; } -GSVector4i GPU::CalculateDrawRect(s32 window_width, s32 window_height, bool apply_rotation, - bool apply_aspect_ratio) const +GSVector4i GPU::CalculateDrawRect(s32 window_width, s32 window_height, bool apply_rotation, bool apply_aspect_ratio, + GSVector4i* padded_rect) const { const bool integer_scale = (g_settings.display_scaling == DisplayScalingMode::NearestInteger || g_settings.display_scaling == DisplayScalingMode::BilinearInteger); @@ -2451,6 +2452,13 @@ GSVector4i GPU::CalculateDrawRect(s32 window_width, s32 window_height, bool appl const s32 top = static_cast(active_top * scale + top_padding); const s32 right = left + static_cast(active_width * scale); const s32 bottom = top + static_cast(active_height * scale); + + if (padded_rect) + { + *padded_rect = GSVector4i( + GSVector4(left_padding, top_padding, left_padding + display_width * scale, top_padding + display_height * scale)); + } + return GSVector4i(left, top, right, bottom); } @@ -2637,7 +2645,7 @@ bool GPU::RenderScreenshotToBuffer(u32 width, u32 height, const GSVector4i draw_ g_gpu_device->ClearRenderTarget(render_texture.get(), 0); // TODO: this should use copy shader instead. - RenderDisplay(render_texture.get(), draw_rect, postfx); + RenderDisplay(render_texture.get(), draw_rect, draw_rect, postfx); const u32 stride = Common::AlignUpPow2(GPUTexture::GetPixelSize(hdformat) * width, sizeof(u32)); out_pixels->resize((height * stride) / sizeof(u32)); diff --git a/src/core/gpu.h b/src/core/gpu.h index d1398d3cd..d0b4317d5 100644 --- a/src/core/gpu.h +++ b/src/core/gpu.h @@ -4,8 +4,8 @@ #pragma once #include "gpu_types.h" #include "timers.h" -#include "types.h" #include "timing_event.h" +#include "types.h" #include "util/gpu_texture.h" @@ -207,7 +207,8 @@ public: virtual void FlushRender() = 0; /// Helper function for computing the draw rectangle in a larger window. - GSVector4i CalculateDrawRect(s32 window_width, s32 window_height, bool apply_rotation, bool apply_aspect_ratio) const; + GSVector4i CalculateDrawRect(s32 window_width, s32 window_height, bool apply_rotation, bool apply_aspect_ratio, + GSVector4i* padded_rect = nullptr) const; /// Helper function to save current display texture to PNG. bool WriteDisplayTextureToFile(std::string filename, bool compress_on_thread = false); @@ -343,8 +344,7 @@ protected: AddCommandTicks(pixels); } - ALWAYS_INLINE_RELEASE void AddDrawRectangleTicks(const GSVector4i clamped_rect, bool textured, - bool semitransparent) + ALWAYS_INLINE_RELEASE void AddDrawRectangleTicks(const GSVector4i clamped_rect, bool textured, bool semitransparent) { u32 drawn_width = clamped_rect.width(); u32 drawn_height = clamped_rect.height(); @@ -591,7 +591,7 @@ protected: void SetDisplayTexture(GPUTexture* texture, GPUTexture* depth_texture, s32 view_x, s32 view_y, s32 view_width, s32 view_height); - bool RenderDisplay(GPUTexture* target, const GSVector4i draw_rect, bool postfx); + bool RenderDisplay(GPUTexture* target, const GSVector4i draw_rect, const GSVector4i padded_draw_rect, bool postfx); bool Deinterlace(u32 field, u32 line_skip); bool DeinterlaceExtractField(u32 dst_bufidx, GPUTexture* src, u32 x, u32 y, u32 width, u32 height, u32 line_skip);