summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorTechjar <tecknojar@gmail.com>2021-05-22 01:13:55 -0400
committerTechjar <tecknojar@gmail.com>2021-05-22 05:58:52 -0400
commitbe6b000bec8f37fd4440dfcfdeb7630ccd7bfec8 (patch)
tree257f635387e5cd0b458b8df89401ed99ea8e6e86 /Source
parent0f17990137e9d32e442b7baf000098af5ffae111 (diff)
VideoCommon: Account for pixel quads in bounding box calculation
The GC/Wii GPU rasterizes in 2x2 pixel groups, so bounding box values will be rounded to the extents of these groups, rather than the exact pixel. To account for this, we'll round the top/left down to even and the bottom/right up to odd. I have verified that the values resulting from this change exactly match a real Wii.
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/VideoCommon/RenderBase.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp
index f93d498fc6..0ff5b52902 100644
--- a/Source/Core/VideoCommon/RenderBase.cpp
+++ b/Source/Core/VideoCommon/RenderBase.cpp
@@ -187,7 +187,18 @@ void Renderer::ReinterpretPixelData(EFBReinterpretType convtype)
u16 Renderer::BBoxRead(int index)
{
- return BBoxReadImpl(index);
+ u16 value = BBoxReadImpl(index);
+
+ // The GC/Wii GPU rasterizes in 2x2 pixel groups, so bounding box values will be rounded to the
+ // extents of these groups, rather than the exact pixel.
+ // This would have been handled in the pixel shader, but all attempts to do so did not work on
+ // OpenGL/NVIDIA, due to presumably mystical driver behavior with atomics.
+ if (index == 0 || index == 2)
+ value &= ~1;
+ else
+ value |= 1;
+
+ return value;
}
void Renderer::BBoxWrite(int index, u16 value)