From 11f8b8ba4462e33f9154018d520f40aa4bc9bc87 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 14 Sep 2021 15:37:56 +0200 Subject: [PATCH] [dxso] Handle multiplication by zero when emitting clip distances --- src/dxso/dxso_compiler.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/dxso/dxso_compiler.cpp b/src/dxso/dxso_compiler.cpp index 63f608bf1..8675c31cc 100644 --- a/src/dxso/dxso_compiler.cpp +++ b/src/dxso/dxso_compiler.cpp @@ -3653,26 +3653,27 @@ void DxsoCompiler::emitControlFlowGenericLoop( } // Compute clip distances - uint32_t positionId = m_module.opLoad(vec4Type, positionPtr); + DxsoRegisterValue position; + position.type = { DxsoScalarType::Float32, 4 }; + position.id = m_module.opLoad(vec4Type, positionPtr); for (uint32_t i = 0; i < caps::MaxClipPlanes; i++) { std::array blockMembers = {{ m_module.constu32(0), m_module.constu32(i), }}; - - uint32_t planeId = m_module.opLoad(vec4Type, - m_module.opAccessChain( - m_module.defPointerType(vec4Type, spv::StorageClassUniform), - clipPlaneBlock, blockMembers.size(), blockMembers.data())); - - uint32_t distId = m_module.opDot(floatType, positionId, planeId); - - m_module.opStore( - m_module.opAccessChain( - m_module.defPointerType(floatType, spv::StorageClassOutput), - clipDistArray, 1, &blockMembers[1]), - distId); + + DxsoRegisterValue plane; + plane.type = { DxsoScalarType::Float32, 4 }; + plane.id = m_module.opLoad(vec4Type, m_module.opAccessChain( + m_module.defPointerType(vec4Type, spv::StorageClassUniform), + clipPlaneBlock, blockMembers.size(), blockMembers.data())); + + DxsoRegisterValue dist = emitDot(position, plane); + + m_module.opStore(m_module.opAccessChain( + m_module.defPointerType(floatType, spv::StorageClassOutput), + clipDistArray, 1, &blockMembers[1]), dist.id); } }