GSdx-d3d11: Add remaining psm.depth code.

Fixes recent regression on Soul Calibur.
It helps isolate psm.depth when it should and shouldn't run even if
sampling isn't supported yet.

Finding Nemo depth issue remains.
People can use the option to disable depth for now on that game.
This commit is contained in:
lightningterror 2018-12-17 07:17:17 +01:00
parent 93f1dc2804
commit c2fd67b1cb
1 changed files with 21 additions and 1 deletions

View File

@ -166,7 +166,7 @@ void GSRendererDX::EmulateTextureSampler(const GSTextureCache::Source* tex)
bool complex_wms_wmt = !!((wms | wmt) & 2);
bool bilinear = m_vt.IsLinear();
bool shader_emulated_sampler = tex->m_palette || cpsm.fmt != 0 || complex_wms_wmt;
bool shader_emulated_sampler = tex->m_palette || cpsm.fmt != 0 || complex_wms_wmt || psm.depth;
// 1 and 0 are equivalent
m_ps_sel.wms = (wms & 2) ? wms : 0;
@ -180,6 +180,10 @@ void GSRendererDX::EmulateTextureSampler(const GSTextureCache::Source* tex)
GSVector4 WH(tw, th, w, h);
// Depth + bilinear filtering isn't done yet (And I'm not sure we need it anyway but a game will prove me wrong)
// So of course, GTA set the linear mode, but sampling is done at texel center so it is equivalent to nearest sampling
ASSERT(!(psm.depth && m_vt.IsLinear()));
// Performance note:
// 1/ Don't set 0 as it is the default value
// 2/ Only keep aem when it is useful (avoid useless shader permutation)
@ -190,6 +194,13 @@ void GSRendererDX::EmulateTextureSampler(const GSTextureCache::Source* tex)
m_ps_sel.aem = m_env.TEXA.AEM;
ASSERT(tex->m_target);
// Require a float conversion if the texure is a depth otherwise uses Integral scaling
if (psm.depth)
{
m_ps_sel.depth_fmt = (tex->m_texture->GetType() != GSTexture::DepthStencil) ? 3 : 1;
// m_vs_sel.int_fst = !PRIM->FST; // select float/int coordinate
}
// Shuffle is a 16 bits format, so aem is always required
GSVector4 ta(m_env.TEXA & GSVector4i::x000000ff());
ps_cb.MinF_TA = (GSVector4(ps_cb.MskFix) + 0.5f).xyxy(ta) / WH.xyxy(GSVector4(255, 255));
@ -244,6 +255,15 @@ void GSRendererDX::EmulateTextureSampler(const GSTextureCache::Source* tex)
// Don't force interpolation on depth format
bilinear &= m_vt.IsLinear();
}
else if (psm.depth)
{
// Use Integral scaling
m_ps_sel.depth_fmt = 3;
// m_vs_sel.int_fst = !PRIM->FST; // select float/int coordinate
// Don't force interpolation on depth format
bilinear &= m_vt.IsLinear();
}
GSVector4 half_offset = RealignTargetTextureCoordinate(tex);
vs_cb.Texture_Scale_Offset.z = half_offset.x;