From 78e4816fc09fe34fbc2fa89ee5a809e0038951d0 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Tue, 17 Dec 2019 03:01:17 +0000 Subject: [PATCH] [d3d9] Avoid unnecessary state block constant bits when not SWVPing --- src/d3d9/d3d9_stateblock.cpp | 11 ++++++++--- src/d3d9/d3d9_stateblock.h | 12 ++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/d3d9/d3d9_stateblock.cpp b/src/d3d9/d3d9_stateblock.cpp index 48616cc01..d3072f7af 100644 --- a/src/d3d9/d3d9_stateblock.cpp +++ b/src/d3d9/d3d9_stateblock.cpp @@ -462,9 +462,14 @@ namespace dxvk { m_captures.flags.set(D3D9CapturedStateFlag::VertexShader); m_captures.flags.set(D3D9CapturedStateFlag::VsConstants); - m_captures.vsConsts.fConsts.setAll(); - m_captures.vsConsts.iConsts.setAll(); - m_captures.vsConsts.bConsts.setAll(); + for (uint32_t i = 0; i < m_parent->GetVertexConstantLayout().floatCount / 32; i++) + m_captures.vsConsts.fConsts.dword(i) = std::numeric_limits::max(); + + for (uint32_t i = 0; i < m_parent->GetVertexConstantLayout().intCount / 32; i++) + m_captures.vsConsts.iConsts.dword(i) = std::numeric_limits::max(); + + for (uint32_t i = 0; i < m_parent->GetVertexConstantLayout().bitmaskCount; i++) + m_captures.vsConsts.bConsts.dword(i) = std::numeric_limits::max(); } diff --git a/src/d3d9/d3d9_stateblock.h b/src/d3d9/d3d9_stateblock.h index 5bbfb6120..38de6f405 100644 --- a/src/d3d9/d3d9_stateblock.h +++ b/src/d3d9/d3d9_stateblock.h @@ -309,8 +309,10 @@ namespace dxvk { } } - for (uint32_t i = 0; i < m_captures.vsConsts.bConsts.dwordCount(); i++) - dst->SetVertexBoolBitfield(i, m_captures.vsConsts.bConsts.dword(i), src->vsConsts.bConsts[i]); + if (m_captures.vsConsts.bConsts.any()) { + for (uint32_t i = 0; i < m_captures.vsConsts.bConsts.dwordCount(); i++) + dst->SetVertexBoolBitfield(i, m_captures.vsConsts.bConsts.dword(i), src->vsConsts.bConsts[i]); + } } if (m_captures.flags.test(D3D9CapturedStateFlag::PsConstants)) { @@ -330,8 +332,10 @@ namespace dxvk { } } - for (uint32_t i = 0; i < m_captures.psConsts.bConsts.dwordCount(); i++) - dst->SetPixelBoolBitfield(i, m_captures.psConsts.bConsts.dword(i), src->psConsts.bConsts[i]); + if (m_captures.psConsts.bConsts.any()) { + for (uint32_t i = 0; i < m_captures.psConsts.bConsts.dwordCount(); i++) + dst->SetPixelBoolBitfield(i, m_captures.psConsts.bConsts.dword(i), src->psConsts.bConsts[i]); + } } }