1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-27 13:54:16 +01:00

[d3d9] Avoid multiple tzcnts per loop in hazard tracking

This commit is contained in:
Joshua Ashton 2020-03-09 00:41:43 +00:00
parent f6b26b302d
commit 812a113a85

View File

@ -4751,7 +4751,8 @@ namespace dxvk {
m_activeHazardsRT = 0;
for (uint32_t rt = masks.rtMask; rt; rt &= rt - 1) {
for (uint32_t sampler = masks.samplerMask; sampler; sampler &= sampler - 1) {
D3D9Surface* rtSurf = m_state.renderTargets[bit::tzcnt(rt)].ptr();
const uint32_t rtIdx = bit::tzcnt(rt);
D3D9Surface* rtSurf = m_state.renderTargets[rtIdx].ptr();
IDirect3DBaseTexture9* rtBase = rtSurf->GetBaseTexture();
IDirect3DBaseTexture9* texBase = m_state.textures[bit::tzcnt(sampler)];
@ -4764,7 +4765,7 @@ namespace dxvk {
if (likely(rtSurf->GetMipLevel() != 0 || rtBase != texBase))
continue;
m_activeHazardsRT |= 1 << bit::tzcnt(rt);
m_activeHazardsRT |= 1 << rtIdx;
}
}
}
@ -4775,13 +4776,15 @@ namespace dxvk {
if (m_state.depthStencil != nullptr &&
m_state.depthStencil->GetBaseTexture() != nullptr) {
for (uint32_t sampler = m_activeDSTextures; sampler; sampler &= sampler - 1) {
const uint32_t samplerIdx = bit::tzcnt(sampler);
IDirect3DBaseTexture9* dsBase = m_state.depthStencil->GetBaseTexture();
IDirect3DBaseTexture9* texBase = m_state.textures[bit::tzcnt(sampler)];
IDirect3DBaseTexture9* texBase = m_state.textures[samplerIdx];
if (likely(dsBase != texBase))
continue;
m_activeHazardsDS |= 1 << bit::tzcnt(sampler);
m_activeHazardsDS |= 1 << samplerIdx;
}
}
}