From 16294acd2ae97fc7efa8e885fbfb83b834c7976d Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 20 Mar 2019 22:14:38 +1000 Subject: VideoBackends: Scale bounding box rectangle in the pixel shader --- Source/Core/VideoBackends/D3D/Render.cpp | 33 ++------------------- Source/Core/VideoBackends/OGL/Render.cpp | 41 +++++++-------------------- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 41 ++------------------------- 3 files changed, 15 insertions(+), 100 deletions(-) (limited to 'Source/Core/VideoBackends') diff --git a/Source/Core/VideoBackends/D3D/Render.cpp b/Source/Core/VideoBackends/D3D/Render.cpp index a172425e3f..82f3cba743 100644 --- a/Source/Core/VideoBackends/D3D/Render.cpp +++ b/Source/Core/VideoBackends/D3D/Render.cpp @@ -324,40 +324,11 @@ void Renderer::UnbindTexture(const AbstractTexture* texture) u16 Renderer::BBoxRead(int index) { - // Here we get the min/max value of the truncated position of the upscaled framebuffer. - // So we have to correct them to the unscaled EFB sizes. - int value = BBox::Get(index); - - if (index < 2) - { - // left/right - value = value * EFB_WIDTH / m_target_width; - } - else - { - // up/down - value = value * EFB_HEIGHT / m_target_height; - } - if (index & 1) - value++; // fix max values to describe the outer border - - return value; + return static_cast(BBox::Get(index)); } -void Renderer::BBoxWrite(int index, u16 _value) +void Renderer::BBoxWrite(int index, u16 value) { - int value = _value; // u16 isn't enough to multiply by the efb width - if (index & 1) - value--; - if (index < 2) - { - value = value * m_target_width / EFB_WIDTH; - } - else - { - value = value * m_target_height / EFB_HEIGHT; - } - BBox::Set(index, value); } diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index d0f3e74c5a..fca1de7e7b 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -837,49 +837,30 @@ void Renderer::SetScissorRect(const MathUtil::Rectangle& rc) u16 Renderer::BBoxRead(int index) { - int swapped_index = index; + // swap 2 and 3 for top/bottom if (index >= 2) - swapped_index ^= 1; // swap 2 and 3 for top/bottom + index ^= 1; - // Here we get the min/max value of the truncated position of the upscaled and swapped - // framebuffer. - // So we have to correct them to the unscaled EFB sizes. - int value = BoundingBox::Get(swapped_index); - - if (index < 2) - { - // left/right - value = value * EFB_WIDTH / m_target_width; - } - else + int value = BoundingBox::Get(index); + if (index >= 2) { // up/down -- we have to swap up and down - value = value * EFB_HEIGHT / m_target_height; - value = EFB_HEIGHT - value - 1; + value = EFB_HEIGHT - value; } - if (index & 1) - value++; // fix max values to describe the outer border - return value; + return static_cast(value); } -void Renderer::BBoxWrite(int index, u16 _value) +void Renderer::BBoxWrite(int index, u16 value) { - int value = _value; // u16 isn't enough to multiply by the efb width - if (index & 1) - value--; - if (index < 2) - { - value = value * m_target_width / EFB_WIDTH; - } - else + s32 swapped_value = value; + if (index >= 2) { index ^= 1; // swap 2 and 3 for top/bottom - value = EFB_HEIGHT - value - 1; - value = value * m_target_height / EFB_HEIGHT; + swapped_value = EFB_HEIGHT - swapped_value; } - BoundingBox::Set(index, value); + BoundingBox::Set(index, swapped_value); } void Renderer::SetViewport(float x, float y, float width, float height, float near_depth, diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index ae3c7c5807..8b560be15d 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -131,49 +131,12 @@ void Renderer::SetPipeline(const AbstractPipeline* pipeline) u16 Renderer::BBoxRead(int index) { - s32 value = m_bounding_box->Get(static_cast(index)); - - // Here we get the min/max value of the truncated position of the upscaled framebuffer. - // So we have to correct them to the unscaled EFB sizes. - if (index < 2) - { - // left/right - value = value * EFB_WIDTH / m_target_width; - } - else - { - // up/down - value = value * EFB_HEIGHT / m_target_height; - } - - // fix max values to describe the outer border - if (index & 1) - value++; - - return static_cast(value); + return static_cast(m_bounding_box->Get(index)); } void Renderer::BBoxWrite(int index, u16 value) { - s32 scaled_value = static_cast(value); - - // fix max values to describe the outer border - if (index & 1) - scaled_value--; - - // scale to internal resolution - if (index < 2) - { - // left/right - scaled_value = scaled_value * m_target_width / EFB_WIDTH; - } - else - { - // up/down - scaled_value = scaled_value * m_target_height / EFB_HEIGHT; - } - - m_bounding_box->Set(static_cast(index), scaled_value); + m_bounding_box->Set(index, value); } void Renderer::BBoxFlush() -- cgit v1.2.3