From 7359c8f08356179f81e517091af9f68334f162c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 12 Jul 2021 21:03:29 +0200 Subject: [PATCH 1/2] Revert "Make sure we don't try to set a negative viewport size." This reverts commit 0386cafe531849e3009df5123277825d11f99afa. --- GPU/Common/GPUStateUtils.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/GPU/Common/GPUStateUtils.cpp b/GPU/Common/GPUStateUtils.cpp index 331436b02a..877c8c97de 100644 --- a/GPU/Common/GPUStateUtils.cpp +++ b/GPU/Common/GPUStateUtils.cpp @@ -575,9 +575,6 @@ void ConvertViewportAndScissor(bool useBufferedRendering, float renderWidth, flo renderHeightFactor = renderHeight / 272.0f; } - _assert_(renderWidthFactor > 0.0); - _assert_(renderHeightFactor > 0.0); - renderX = gstate_c.curRTOffsetX; // Scissor @@ -697,11 +694,8 @@ void ConvertViewportAndScissor(bool useBufferedRendering, float renderWidth, flo out.viewportX = left * renderWidthFactor + displayOffsetX; out.viewportY = top * renderHeightFactor + displayOffsetY; - - // The calculations should end up with zero or positive values, but let's protect against any - // precision issues. See #13921. - out.viewportW = std::max(0.0f, (right - left) * renderWidthFactor); - out.viewportH = std::max(0.0f, (bottom - top) * renderHeightFactor); + out.viewportW = (right - left) * renderWidthFactor; + out.viewportH = (bottom - top) * renderHeightFactor; // The depth viewport parameters are the same, but we handle it a bit differently. // When clipping is enabled, depth is clamped to [0, 65535]. And minz/maxz discard. From 69ae3f4c0280874cfbac3cdb454bc9a7a3653335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 12 Jul 2021 21:18:17 +0200 Subject: [PATCH 2/2] Better protection against broken viewports. It's ok if this emits a single pixel sized viewport, since the cause of this is generally the viewport being specified outside the scissor rectangle. Fixes #13921 --- GPU/Common/GPUStateUtils.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/GPU/Common/GPUStateUtils.cpp b/GPU/Common/GPUStateUtils.cpp index 877c8c97de..47fc87a5e0 100644 --- a/GPU/Common/GPUStateUtils.cpp +++ b/GPU/Common/GPUStateUtils.cpp @@ -664,6 +664,12 @@ void ConvertViewportAndScissor(bool useBufferedRendering, float renderWidth, flo left += overageLeft; right -= overageRight; + // Protect against the viewport being entirely outside the scissor. + // Emit a tiny but valid viewport. Really, we should probably emit a flag to ignore draws. + if (right <= left) { + right = left + 1.0f; + } + wScale = vpWidth / (right - left); xOffset = drift / (right - left); } @@ -687,6 +693,12 @@ void ConvertViewportAndScissor(bool useBufferedRendering, float renderWidth, flo top += overageTop; bottom -= overageBottom; + // Protect against the viewport being entirely outside the scissor. + // Emit a tiny but valid viewport. Really, we should probably emit a flag to ignore draws. + if (bottom <= top) { + bottom = top + 1.0f; + } + hScale = vpHeight / (bottom - top); yOffset = drift / (bottom - top); }