mirror of https://github.com/PCSX2/pcsx2.git
GS: Don't apply offset when using SLBG. Fixes The Suffering video monitors
This commit is contained in:
parent
f1d3177b69
commit
074ffacf9d
|
@ -157,6 +157,8 @@ bool GSRenderer::Merge(int field)
|
||||||
GSVector4 src_hw[2];
|
GSVector4 src_hw[2];
|
||||||
GSVector4 dst[2];
|
GSVector4 dst[2];
|
||||||
|
|
||||||
|
const bool slbg = m_regs->PMODE.SLBG;
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++)
|
for (int i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
if (!en[i] || !tex[i])
|
if (!en[i] || !tex[i])
|
||||||
|
@ -172,34 +174,38 @@ bool GSRenderer::Merge(int field)
|
||||||
GSVector2i display_diff(dr[i].left - display_baseline.x, dr[i].top - display_baseline.y);
|
GSVector2i display_diff(dr[i].left - display_baseline.x, dr[i].top - display_baseline.y);
|
||||||
GSVector2i frame_diff(fr[i].left - frame_baseline.x, fr[i].top - frame_baseline.y);
|
GSVector2i frame_diff(fr[i].left - frame_baseline.x, fr[i].top - frame_baseline.y);
|
||||||
|
|
||||||
// Time Crisis 2/3 uses two side by side images when in split screen mode.
|
// Don't apply offset when blending with background color
|
||||||
// Though ignore cases where baseline and display rectangle offsets only differ by 1 pixel, causes blurring and wrong resolution output on FFXII
|
// The Suffering - video monitors (feedback write)
|
||||||
if (display_diff.x > 2)
|
if (!slbg)
|
||||||
{
|
{
|
||||||
off.x = tex[i]->GetScale().x * display_diff.x;
|
// Time Crisis 2/3 uses two side by side images when in split screen mode.
|
||||||
}
|
// Though ignore cases where baseline and display rectangle offsets only differ by 1 pixel, causes blurring and wrong resolution output on FFXII
|
||||||
// If the DX offset is too small then consider the status of frame memory offsets, prevents blurring on Tenchu: Fatal Shadows, Worms 3D
|
if (display_diff.x > 2)
|
||||||
else if (display_diff.x != frame_diff.x)
|
|
||||||
{
|
|
||||||
off.x = tex[i]->GetScale().x * frame_diff.x;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_scanmask_used && display_diff.y == 1) // Scanmask effect wouldn't look correct if we scale the offset
|
|
||||||
off.y = display_diff.y;
|
|
||||||
else if (display_diff.y >= 4) // Shouldn't this be >= 2?
|
|
||||||
{
|
|
||||||
off.y = tex[i]->GetScale().y * display_diff.y;
|
|
||||||
|
|
||||||
if (m_regs->SMODE2.INT && m_regs->SMODE2.FFMD)
|
|
||||||
{
|
{
|
||||||
off.y /= 2;
|
off.x = tex[i]->GetScale().x * display_diff.x;
|
||||||
|
}
|
||||||
|
// If the DX offset is too small then consider the status of frame memory offsets, prevents blurring on Tenchu: Fatal Shadows, Worms 3D
|
||||||
|
else if (display_diff.x != frame_diff.x)
|
||||||
|
{
|
||||||
|
off.x = tex[i]->GetScale().x * frame_diff.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_scanmask_used && display_diff.y == 1) // Scanmask effect wouldn't look correct if we scale the offset
|
||||||
|
off.y = display_diff.y;
|
||||||
|
else if (display_diff.y >= 4) // Shouldn't this be >= 2?
|
||||||
|
{
|
||||||
|
off.y = tex[i]->GetScale().y * display_diff.y;
|
||||||
|
|
||||||
|
if (m_regs->SMODE2.INT && m_regs->SMODE2.FFMD)
|
||||||
|
{
|
||||||
|
off.y /= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (display_diff.y != frame_diff.y)
|
||||||
|
{
|
||||||
|
off.y = tex[i]->GetScale().y * frame_diff.y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (display_diff.y != frame_diff.y)
|
|
||||||
{
|
|
||||||
off.y = tex[i]->GetScale().y * frame_diff.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
dst[i] = GSVector4(off).xyxy() + scale * GSVector4(r.rsize());
|
dst[i] = GSVector4(off).xyxy() + scale * GSVector4(r.rsize());
|
||||||
|
|
||||||
fs.x = std::max(fs.x, (int)(dst[i].z + 0.5f));
|
fs.x = std::max(fs.x, (int)(dst[i].z + 0.5f));
|
||||||
|
@ -214,8 +220,6 @@ bool GSRenderer::Merge(int field)
|
||||||
}
|
}
|
||||||
m_real_size = ds;
|
m_real_size = ds;
|
||||||
|
|
||||||
bool slbg = m_regs->PMODE.SLBG;
|
|
||||||
|
|
||||||
if (tex[0] || tex[1])
|
if (tex[0] || tex[1])
|
||||||
{
|
{
|
||||||
if (tex[0] == tex[1] && !slbg && (src[0] == src[1] & dst[0] == dst[1]).alltrue())
|
if (tex[0] == tex[1] && !slbg && (src[0] == src[1] & dst[0] == dst[1]).alltrue())
|
||||||
|
|
Loading…
Reference in New Issue