From ffe35f73af226a863da5e18cc5f2c94bda08fbdd Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Wed, 4 Nov 2015 22:29:18 +0100 Subject: [PATCH 1/3] Fix viewport vertical positioning, fixing #8165. However, God Eater bloom breaks. Why?? --- GPU/GLES/StateMapping.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index e5137924be..3a48c5e49d 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -835,22 +835,19 @@ void TransformDrawEngine::ApplyDrawState(int prim) { // This means that to get the analogue glViewport we must: float vpX0 = vpXCenter - offsetX - fabsf(vpXScale); - float vpY0 = vpYCenter - offsetY + fabsf(vpYScale); // Need to account for sign of Y + float vpY0 = vpYCenter - offsetY - fabsf(vpYScale); // Need to account for sign of Y gstate_c.vpWidth = vpXScale * 2.0f; gstate_c.vpHeight = -vpYScale * 2.0f; float vpWidth = fabsf(gstate_c.vpWidth); float vpHeight = fabsf(gstate_c.vpHeight); + // This multiplication should probably be done after viewport clipping. Would let us very slightly simplify the clipping logic? vpX0 *= renderWidthFactor; vpY0 *= renderHeightFactor; vpWidth *= renderWidthFactor; vpHeight *= renderHeightFactor; - // Flip vpY0 to match the OpenGL coordinate system. - // TODO: This makes no sense anymore, in "flipped space". - vpY0 = renderHeight - vpY0; - // We used to apply the viewport here via glstate, but there are limits which vary by driver. // This may mean some games won't work, or at least won't work at higher render resolutions. // So we apply it in the shader instead. From 5bfcd07b353f2c52b067ca475aba7fec5a3224c2 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Wed, 4 Nov 2015 22:57:22 +0100 Subject: [PATCH 2/3] Viewport clipping/overage fix --- GPU/GLES/StateMapping.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index 3a48c5e49d..b25b6a1014 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -879,7 +879,7 @@ void TransformDrawEngine::ApplyDrawState(int prim) { float overageTop = std::max(-top, 0.0f); float overageBottom = std::max(bottom - renderHeight, 0.0f); // Our center drifted by the difference in overages. - float drift = overageTop - overageBottom; + float drift = overageBottom - overageTop; top += overageTop; bottom -= overageBottom; From aac0cd3227d456bb6fee6825a6b31eef0ef693f7 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Thu, 5 Nov 2015 00:08:48 +0100 Subject: [PATCH 3/3] Minor consistency improvement between d3d and opengl code --- GPU/Common/SoftwareTransformCommon.cpp | 2 +- GPU/Directx9/TransformPipelineDX9.cpp | 2 +- GPU/GLES/ShaderManager.cpp | 2 +- GPU/GLES/StateMapping.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GPU/Common/SoftwareTransformCommon.cpp b/GPU/Common/SoftwareTransformCommon.cpp index 5b31e73163..47bc73c1d7 100644 --- a/GPU/Common/SoftwareTransformCommon.cpp +++ b/GPU/Common/SoftwareTransformCommon.cpp @@ -471,7 +471,7 @@ void SoftwareTransform( if (!throughmode) { memcpy(&flippedMatrix, gstate.projMatrix, 16 * sizeof(float)); - const bool invertedY = useBufferedRendering ? (gstate_c.vpHeight > 0) : (gstate_c.vpHeight < 0); + const bool invertedY = useBufferedRendering ? (gstate_c.vpHeight < 0) : (gstate_c.vpHeight > 0); if (invertedY) { flippedMatrix[1] = -flippedMatrix[1]; flippedMatrix[5] = -flippedMatrix[5]; diff --git a/GPU/Directx9/TransformPipelineDX9.cpp b/GPU/Directx9/TransformPipelineDX9.cpp index 201168299a..19f894c7b8 100644 --- a/GPU/Directx9/TransformPipelineDX9.cpp +++ b/GPU/Directx9/TransformPipelineDX9.cpp @@ -832,7 +832,7 @@ rotateVBO: SoftwareTransform( prim, decoded, indexGen.VertexCount(), dec_->VertexType(), inds, GE_VTYPE_IDX_16BIT, dec_->GetDecVtxFmt(), - maxIndex, framebufferManager_, textureCache_, transformed, transformedExpanded, drawBuffer, numTrans, drawIndexed, &result, -1.0f); + maxIndex, framebufferManager_, textureCache_, transformed, transformedExpanded, drawBuffer, numTrans, drawIndexed, &result, 1.0f); ApplyDrawStateLate(); vshader = shaderManager_->ApplyShader(prim, lastVType_); diff --git a/GPU/GLES/ShaderManager.cpp b/GPU/GLES/ShaderManager.cpp index 4eee88ecd7..49c663a3f7 100644 --- a/GPU/GLES/ShaderManager.cpp +++ b/GPU/GLES/ShaderManager.cpp @@ -410,7 +410,7 @@ void LinkedShader::UpdateUniforms(u32 vertType) { bool useBufferedRendering = g_Config.iRenderingMode != FB_NON_BUFFERED_MODE; - const bool invertedY = useBufferedRendering ? (gstate_c.vpHeight > 0) : (gstate_c.vpHeight < 0); + const bool invertedY = useBufferedRendering ? (gstate_c.vpHeight < 0) : (gstate_c.vpHeight > 0); if (invertedY) { flippedMatrix[1] = -flippedMatrix[1]; flippedMatrix[5] = -flippedMatrix[5]; diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index b25b6a1014..f0de48ae03 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -837,7 +837,7 @@ void TransformDrawEngine::ApplyDrawState(int prim) { float vpX0 = vpXCenter - offsetX - fabsf(vpXScale); float vpY0 = vpYCenter - offsetY - fabsf(vpYScale); // Need to account for sign of Y gstate_c.vpWidth = vpXScale * 2.0f; - gstate_c.vpHeight = -vpYScale * 2.0f; + gstate_c.vpHeight = vpYScale * 2.0f; float vpWidth = fabsf(gstate_c.vpWidth); float vpHeight = fabsf(gstate_c.vpHeight);