From 357e0316a054df6e722c530fb4412c6a8a4228bc Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2019 10:48:01 -0800 Subject: [PATCH 1/2] GPU: Handle cull range properly drawing at offset. Did the transformation backwards. --- GPU/Common/ShaderUniforms.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GPU/Common/ShaderUniforms.cpp b/GPU/Common/ShaderUniforms.cpp index f8fb3456e912..8823c764c1c4 100644 --- a/GPU/Common/ShaderUniforms.cpp +++ b/GPU/Common/ShaderUniforms.cpp @@ -30,7 +30,7 @@ void CalcCullRange(float minValues[4], float maxValues[4], bool flipViewport, bo // Account for the projection viewport adjustment when viewport is too large. auto reverseViewportX = [](float x) { float pspViewport = (x - gstate.getViewportXCenter()) * (1.0f / gstate.getViewportXScale()); - return (pspViewport - gstate_c.vpXOffset) * gstate_c.vpWidthScale; + return (pspViewport * gstate_c.vpWidthScale) - gstate_c.vpXOffset; }; auto reverseViewportY = [flipViewport](float y) { float heightScale = gstate_c.vpHeightScale; @@ -39,7 +39,7 @@ void CalcCullRange(float minValues[4], float maxValues[4], bool flipViewport, bo heightScale = -heightScale; } float pspViewport = (y - gstate.getViewportYCenter()) * (1.0f / gstate.getViewportYScale()); - return (pspViewport - gstate_c.vpYOffset) * heightScale; + return (pspViewport * heightScale) - gstate_c.vpYOffset; }; auto reverseViewportZ = [hasNegZ](float z) { float vpZScale = gstate.getViewportZScale(); From d7f2167898d7c8b98a369f938a9cb3eb7198866b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2019 10:57:49 -0800 Subject: [PATCH 2/2] GLES: Correct cull range offset in unbuffered. --- GPU/Common/ShaderUniforms.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/GPU/Common/ShaderUniforms.cpp b/GPU/Common/ShaderUniforms.cpp index 8823c764c1c4..46ad4470e245 100644 --- a/GPU/Common/ShaderUniforms.cpp +++ b/GPU/Common/ShaderUniforms.cpp @@ -34,12 +34,14 @@ void CalcCullRange(float minValues[4], float maxValues[4], bool flipViewport, bo }; auto reverseViewportY = [flipViewport](float y) { float heightScale = gstate_c.vpHeightScale; + float yOffset = gstate_c.vpYOffset; if (flipViewport) { // For D3D11 and GLES non-buffered. heightScale = -heightScale; + yOffset = -yOffset; } float pspViewport = (y - gstate.getViewportYCenter()) * (1.0f / gstate.getViewportYScale()); - return (pspViewport * heightScale) - gstate_c.vpYOffset; + return (pspViewport * heightScale) - yOffset; }; auto reverseViewportZ = [hasNegZ](float z) { float vpZScale = gstate.getViewportZScale();