diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml
index 6561b3389c..765310156f 100644
--- a/Source/Android/app/src/main/res/values/strings.xml
+++ b/Source/Android/app/src/main/res/values/strings.xml
@@ -287,7 +287,7 @@
Disable Bounding Box
Disables bounding box emulation. This may improve GPU performance significantly, but some games will break. If unsure, leave this checked.
Vertex Rounding
- Rounds 2D vertices to whole pixels. Fixes graphical problems in some games at higher internal resolutions. This setting has no effect when native internal resolution is used. If unsure, leave this unchecked.
+ Rounds 2D vertices to whole pixels and rounds the viewport size to a whole number. Fixes graphical problems in some games at higher internal resolutions. This setting has no effect when native internal resolution is used. If unsure, leave this unchecked.
Save Texture Cache to State
Includes the contents of the embedded frame buffer (EFB) and upscaled EFB copies in save states. Fixes missing and/or non-upscaled textures/objects when loading states at the cost of additional save/load time.
Aspect Ratio
diff --git a/Source/Core/DolphinQt/Config/Graphics/HacksWidget.cpp b/Source/Core/DolphinQt/Config/Graphics/HacksWidget.cpp
index b7da070edb..9d7380f8cc 100644
--- a/Source/Core/DolphinQt/Config/Graphics/HacksWidget.cpp
+++ b/Source/Core/DolphinQt/Config/Graphics/HacksWidget.cpp
@@ -275,10 +275,10 @@ void HacksWidget::AddDescriptions()
"states at the cost of additional save/load time.
If "
"unsure, leave this checked.");
static const char TR_VERTEX_ROUNDING_DESCRIPTION[] = QT_TR_NOOP(
- "Rounds 2D vertices to whole pixels.
Fixes graphical problems in some games at "
- "higher internal resolutions. This setting has no effect when native internal "
- "resolution is used.
If unsure, leave this "
- "unchecked.");
+ "Rounds 2D vertices to whole pixels and rounds the viewport size to a whole number.
"
+ "Fixes graphical problems in some games at higher internal resolutions. This setting has no "
+ "effect when native internal resolution is used.
"
+ "If unsure, leave this unchecked.");
m_skip_efb_cpu->SetDescription(tr(TR_SKIP_EFB_CPU_ACCESS_DESCRIPTION));
m_ignore_format_changes->SetDescription(tr(TR_IGNORE_FORMAT_CHANGE_DESCRIPTION));
diff --git a/Source/Core/VideoCommon/BPFunctions.cpp b/Source/Core/VideoCommon/BPFunctions.cpp
index ba2bf6e0d3..fe3867c29c 100644
--- a/Source/Core/VideoCommon/BPFunctions.cpp
+++ b/Source/Core/VideoCommon/BPFunctions.cpp
@@ -4,6 +4,7 @@
#include "VideoCommon/BPFunctions.h"
#include
+#include
#include
#include "Common/CommonTypes.h"
@@ -74,13 +75,26 @@ void SetScissor()
void SetViewport()
{
- s32 xoff = bpmem.scissorOffset.x * 2;
- s32 yoff = bpmem.scissorOffset.y * 2;
- float x = g_renderer->EFBToScaledXf(xfmem.viewport.xOrig - xfmem.viewport.wd - xoff);
- float y = g_renderer->EFBToScaledYf(xfmem.viewport.yOrig + xfmem.viewport.ht - yoff);
+ const s32 xoff = bpmem.scissorOffset.x * 2;
+ const s32 yoff = bpmem.scissorOffset.y * 2;
+ float raw_x = xfmem.viewport.xOrig - xfmem.viewport.wd - xoff;
+ float raw_y = xfmem.viewport.yOrig + xfmem.viewport.ht - yoff;
+ float raw_width = 2.0f * xfmem.viewport.wd;
+ float raw_height = -2.0f * xfmem.viewport.ht;
+ if (g_ActiveConfig.UseVertexRounding())
+ {
+ // Round the viewport to match full 1x IR pixels as well.
+ // This eliminates a line in the archery mode in Wii Sports Resort at 3x IR and higher.
+ raw_x = std::round(raw_x);
+ raw_y = std::round(raw_y);
+ raw_width = std::round(raw_width);
+ raw_height = std::round(raw_height);
+ }
- float width = g_renderer->EFBToScaledXf(2.0f * xfmem.viewport.wd);
- float height = g_renderer->EFBToScaledYf(-2.0f * xfmem.viewport.ht);
+ float x = g_renderer->EFBToScaledXf(raw_x);
+ float y = g_renderer->EFBToScaledYf(raw_y);
+ float width = g_renderer->EFBToScaledXf(raw_width);
+ float height = g_renderer->EFBToScaledYf(raw_height);
float min_depth = (xfmem.viewport.farZ - xfmem.viewport.zRange) / 16777216.0f;
float max_depth = xfmem.viewport.farZ / 16777216.0f;
if (width < 0.f)