Skip to content

Commit

Permalink
[d3d9] Clip plane compaction
Browse files Browse the repository at this point in the history
Compact clip planes to the smallest amount that are enabled.

Signed-off-by: Autumn Ashton <[email protected]>
  • Loading branch information
misyltoad committed Dec 4, 2024
1 parent c552fa9 commit 6870b62
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 13 deletions.
14 changes: 9 additions & 5 deletions src/d3d9/d3d9_device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5933,17 +5933,21 @@ namespace dxvk {
auto mapPtr = m_vsClipPlanes.AllocSlice();
auto dst = reinterpret_cast<D3D9ClipPlane*>(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<SpecClipPlaneMask>(clipPlaneMask))
// Write the rest to 0 for GPL.
for (uint32_t i = clipPlaneCount; i < caps::MaxClipPlanes; i++)
dst[i] = D3D9ClipPlane();

if (m_specInfo.set<SpecClipPlaneCount>(clipPlaneCount))
m_flags.set(D3D9DeviceFlag::DirtySpecializationEntries);
}

Expand Down
6 changes: 3 additions & 3 deletions src/d3d9/d3d9_fixed_function.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand Down
4 changes: 2 additions & 2 deletions src/d3d9/d3d9_spec_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
Expand Down Expand Up @@ -71,7 +71,7 @@ namespace dxvk {
{ 4, 0, 16 }, // DrefClamp
{ 4, 16, 16 }, // Fetch4

{ 5, 0, 6 }, // ClipPlaneEnabled
{ 5, 0, 3 }, // ClipPlaneCount
}};

template <D3D9SpecConstantId Id, typename T>
Expand Down
6 changes: 3 additions & 3 deletions src/dxso/dxso_compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand Down

0 comments on commit 6870b62

Please sign in to comment.