From 6870b628340c6fb618374e32c62ba976c81a64fe Mon Sep 17 00:00:00 2001 From: Autumn Ashton Date: Wed, 4 Dec 2024 16:41:48 +0000 Subject: [PATCH] [d3d9] Clip plane compaction Compact clip planes to the smallest amount that are enabled. Signed-off-by: Autumn Ashton --- src/d3d9/d3d9_device.cpp | 14 +++++++++----- src/d3d9/d3d9_fixed_function.cpp | 6 +++--- src/d3d9/d3d9_spec_constants.h | 4 ++-- src/dxso/dxso_compiler.cpp | 6 +++--- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 1e2eee49785..d2e2557988b 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -5933,17 +5933,21 @@ namespace dxvk { auto mapPtr = m_vsClipPlanes.AllocSlice(); auto dst = reinterpret_cast(mapPtr); - uint32_t clipPlaneMask = 0u; + uint32_t clipPlaneCount = 0u; for (uint32_t i = 0; i < caps::MaxClipPlanes; i++) { - dst[i] = (m_state.renderStates[D3DRS_CLIPPLANEENABLE] & (1 << i)) + D3D9ClipPlane clipPlane = (m_state.renderStates[D3DRS_CLIPPLANEENABLE] & (1 << i)) ? m_state.clipPlanes[i] : D3D9ClipPlane(); - if (dst[i] != D3D9ClipPlane()) - clipPlaneMask |= 1u << i; + if (clipPlane != D3D9ClipPlane()) + dst[clipPlaneCount++] = clipPlane; } - if (m_specInfo.set(clipPlaneMask)) + // Write the rest to 0 for GPL. + for (uint32_t i = clipPlaneCount; i < caps::MaxClipPlanes; i++) + dst[i] = D3D9ClipPlane(); + + if (m_specInfo.set(clipPlaneCount)) m_flags.set(D3D9DeviceFlag::DirtySpecializationEntries); } diff --git a/src/d3d9/d3d9_fixed_function.cpp b/src/d3d9/d3d9_fixed_function.cpp index 4451d8b26a7..9af5456a435 100644 --- a/src/d3d9/d3d9_fixed_function.cpp +++ b/src/d3d9/d3d9_fixed_function.cpp @@ -2421,9 +2421,9 @@ namespace dxvk { uint32_t distId = m_module.opDot(floatType, worldPos, planeId); - // Always consider clip planes enabled when doing GPL by forcing a mask of 0xffffffff for the quick value. - uint32_t clipPlaneEnabledBit = m_spec.get(m_module, m_specUbo, SpecClipPlaneMask, i, 1, m_module.constu32(0xffffffff)); - uint32_t clipPlaneEnabled = m_module.opINotEqual(boolType, clipPlaneEnabledBit, m_module.constu32(0)); + // Always consider clip planes enabled when doing GPL by forcing 6 the quick value. + uint32_t clipPlaneCount = m_spec.get(m_module, m_specUbo, SpecClipPlaneCount, 0, 32, m_module.constu32(6)); + uint32_t clipPlaneEnabled = m_module.opULessThan(boolType, m_module.constu32(i), clipPlaneCount); uint32_t value = m_module.opSelect(floatType, clipPlaneEnabled, distId, m_module.constf32(0.0f)); diff --git a/src/d3d9/d3d9_spec_constants.h b/src/d3d9/d3d9_spec_constants.h index 835717bd13b..8732d7c4343 100644 --- a/src/d3d9/d3d9_spec_constants.h +++ b/src/d3d9/d3d9_spec_constants.h @@ -30,7 +30,7 @@ namespace dxvk { SpecDrefClamp, // 1 bit for 16 PS samplers | Bits: 16 SpecFetch4, // 1 bit for 16 PS samplers | Bits: 16 - SpecClipPlaneMask, // 6 bits for 6 clip planes | Bits : 6 + SpecClipPlaneCount, // 3 bits for 6 clip planes | Bits : 3 SpecConstantCount, }; @@ -71,7 +71,7 @@ namespace dxvk { { 4, 0, 16 }, // DrefClamp { 4, 16, 16 }, // Fetch4 - { 5, 0, 6 }, // ClipPlaneEnabled + { 5, 0, 3 }, // ClipPlaneCount }}; template diff --git a/src/dxso/dxso_compiler.cpp b/src/dxso/dxso_compiler.cpp index ca171ace4ed..4e2de0db03b 100644 --- a/src/dxso/dxso_compiler.cpp +++ b/src/dxso/dxso_compiler.cpp @@ -3552,9 +3552,9 @@ void DxsoCompiler::emitControlFlowGenericLoop( DxsoRegisterValue dist = emitDot(position, plane); - // Always consider clip planes enabled when doing GPL by forcing a mask of 0xffffffff for the quick value. - uint32_t clipPlaneEnabledBit = m_spec.get(m_module, m_specUbo, SpecClipPlaneMask, i, 1, m_module.constu32(0xffffffff)); - uint32_t clipPlaneEnabled = m_module.opINotEqual(boolType, clipPlaneEnabledBit, m_module.constu32(0)); + // Always consider clip planes enabled when doing GPL by forcing 6 the quick value. + uint32_t clipPlaneCount = m_spec.get(m_module, m_specUbo, SpecClipPlaneCount, 0, 32, m_module.constu32(6)); + uint32_t clipPlaneEnabled = m_module.opULessThan(boolType, m_module.constu32(i), clipPlaneCount); uint32_t value = m_module.opSelect(floatType, clipPlaneEnabled, dist.id, m_module.constf32(0.0f));