summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VertexManagerBase.cpp
diff options
context:
space:
mode:
authorNanoByte011 <nanobyte011@hotmail.com>2015-01-13 02:55:25 -0700
committerScott Mansell <phiren@gmail.com>2015-01-23 03:32:31 +1300
commitadd59b3bea032e331363dcf28361f8e0de65e43d (patch)
treec1cb3a129663f4ec68e6b8f165508ef5e9b5ebc8 /Source/Core/VideoCommon/VertexManagerBase.cpp
parent6d5065c58d06e14a0c92632ce794958ddff977f3 (diff)
Fixes Mario Tennis Gimmick Courts and adds support for FastDepthCalc
- Calculate ZSlope every flush but only set PixelShader Constant on Reset Buffer when zfreeze - Fixed another Pixel Shader bug in D3D that was giving me grief
Diffstat (limited to 'Source/Core/VideoCommon/VertexManagerBase.cpp')
-rw-r--r--Source/Core/VideoCommon/VertexManagerBase.cpp22
1 files changed, 15 insertions, 7 deletions
diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp
index bcdaf466a4..23eb770c6d 100644
--- a/Source/Core/VideoCommon/VertexManagerBase.cpp
+++ b/Source/Core/VideoCommon/VertexManagerBase.cpp
@@ -25,6 +25,8 @@ u8 *VertexManager::s_pEndBufferPointer;
PrimitiveType VertexManager::current_primitive_type;
+Slope VertexManager::ZSlope;
+
bool VertexManager::IsFlushed;
static const PrimitiveType primitive_from_gx[8] = {
@@ -246,6 +248,8 @@ void VertexManager::CalculateZSlope(u32 stride)
{
float vtx[9];
float out[12];
+ float viewOffset[2] = { xfmem.viewport.xOrig - bpmem.scissorOffset.x * 2,
+ xfmem.viewport.yOrig - bpmem.scissorOffset.y * 2};
// Lookup vertices of the last rendered triangle and software-transform them
// This allows us to determine the depth slope, which will be used if zfreeze
@@ -260,9 +264,11 @@ void VertexManager::CalculateZSlope(u32 stride)
VertexShaderManager::TransformToClipSpace(&vtx[i * 3], &out[i * 4]);
// Transform to Screenspace
- out[0 + i * 4] = out[0 + i * 4] / out[3 + i * 4] * xfmem.viewport.wd + (xfmem.viewport.xOrig - 342);
- out[1 + i * 4] = out[1 + i * 4] / out[3 + i * 4] * xfmem.viewport.ht + (xfmem.viewport.yOrig - 342);
- out[2 + i * 4] = out[2 + i * 4] / out[3 + i * 4] * xfmem.viewport.zRange + xfmem.viewport.farZ;
+ float w = out[3 + i * 4];
+
+ out[0 + i * 4] = out[0 + i * 4] / w * xfmem.viewport.wd + viewOffset[0];
+ out[1 + i * 4] = out[1 + i * 4] / w * xfmem.viewport.ht + viewOffset[1];
+ out[2 + i * 4] = out[2 + i * 4] / w * xfmem.viewport.zRange + xfmem.viewport.farZ;
}
float dx31 = out[8] - out[0];
@@ -276,9 +282,11 @@ void VertexManager::CalculateZSlope(u32 stride)
float b = dx31 * DF21 + dx12 * DF31;
float c = -dx12 * dy31 - dx31 * -dy12;
- float slope_dfdx = -a / c;
- float slope_dfdy = -b / c;
- float slope_f0 = out[2] - (out[0] * slope_dfdx + out[1] * slope_dfdy);
+ // Stop divide by zero
+ if (c == 0)
+ return;
- PixelShaderManager::SetZSlope(slope_dfdx, slope_dfdy, slope_f0);
+ ZSlope.dfdx = -a / c;
+ ZSlope.dfdy = -b / c;
+ ZSlope.f0 = out[2] - (out[0] * ZSlope.dfdx + out[1] * ZSlope.dfdy);
}