From 812a113a85355bd8644b407d9fae123d1cecca28 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Mon, 9 Mar 2020 00:41:43 +0000 Subject: [PATCH] [d3d9] Avoid multiple tzcnts per loop in hazard tracking --- src/d3d9/d3d9_device.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index b38e8310..87bce9fc 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -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; } } }