mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-06-11 16:49:28 +02:00
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
This commit is contained in:

committed by
Scott Mansell

parent
6d5065c58d
commit
add59b3bea
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user