Don't mess with vpDepth in through mode. Fixes glitches in Wipeout Pulse.

This commit is contained in:
Henrik Rydgard 2015-11-09 21:57:48 +01:00
parent 5667f34805
commit 5a8e86e8ba

View File

@ -666,18 +666,22 @@ void TransformDrawEngineDX9::ApplyDrawState(int prim) {
dxstate.scissorTest.disable(); dxstate.scissorTest.disable();
} }
// Direct3D can't handle negative depth ranges, so we fix it in the projection matrix.
float depthMin = vpAndScissor.depthRangeMin; float depthMin = vpAndScissor.depthRangeMin;
float depthMax = vpAndScissor.depthRangeMax; float depthMax = vpAndScissor.depthRangeMax;
if (gstate_c.vpDepth != depthMax - depthMin) {
gstate_c.vpDepth = depthMax - depthMin; if (!gstate.isModeThrough()) {
vpAndScissor.dirtyProj = true; // Direct3D can't handle negative depth ranges, so we fix it in the projection matrix.
if (gstate_c.vpDepth != depthMax - depthMin) {
gstate_c.vpDepth = depthMax - depthMin;
vpAndScissor.dirtyProj = true;
}
if (depthMin > depthMax) {
std::swap(depthMin, depthMax);
}
if (depthMin < 0.0f) depthMin = 0.0f;
if (depthMax > 1.0f) depthMax = 1.0f;
} }
if (depthMin > depthMax) {
std::swap(depthMin, depthMax);
}
if (depthMin < 0.0f) depthMin = 0.0f;
if (depthMax > 1.0f) depthMax = 1.0f;
dxstate.viewport.set(vpAndScissor.viewportX, vpAndScissor.viewportY, vpAndScissor.viewportW, vpAndScissor.viewportH, depthMin, depthMax); dxstate.viewport.set(vpAndScissor.viewportX, vpAndScissor.viewportY, vpAndScissor.viewportW, vpAndScissor.viewportH, depthMin, depthMax);
if (vpAndScissor.dirtyProj) { if (vpAndScissor.dirtyProj) {
shaderManager_->DirtyUniform(DIRTY_PROJMATRIX); shaderManager_->DirtyUniform(DIRTY_PROJMATRIX);