1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-01-31 14:52:11 +01:00

[dxso] Handle multiplication by zero in cross product

This commit is contained in:
Philip Rebohle 2021-09-14 15:27:27 +02:00 committed by Joshie
parent 7b2b8ceff3
commit 8063e27c08
2 changed files with 37 additions and 5 deletions

View File

@ -1495,6 +1495,36 @@ namespace dxvk {
} }
DxsoRegisterValue DxsoCompiler::emitCross(
DxsoRegisterValue a,
DxsoRegisterValue b) {
const std::array<uint32_t, 4> shiftIndices = { 1, 2, 0, 1 };
DxsoRegisterValue result;
result.type = { DxsoScalarType::Float32, 3 };
uint32_t typeId = getVectorTypeId(result.type);
std::array<DxsoRegisterValue, 2> products;
for (uint32_t i = 0; i < 2; i++) {
DxsoRegisterValue ashift;
ashift.type = result.type;
ashift.id = m_module.opVectorShuffle(typeId,
a.id, a.id, 3, &shiftIndices[i]);
DxsoRegisterValue bshift;
bshift.type = result.type;
bshift.id = m_module.opVectorShuffle(typeId,
b.id, b.id, 3, &shiftIndices[1 - i]);
products[i] = emitMul(ashift, bshift);
}
result.id = m_module.opFSub(typeId, products[0].id, products[1].id);
return result;
}
DxsoRegisterValue DxsoCompiler::emitRegisterInsert( DxsoRegisterValue DxsoCompiler::emitRegisterInsert(
DxsoRegisterValue dstValue, DxsoRegisterValue dstValue,
DxsoRegisterValue srcValue, DxsoRegisterValue srcValue,
@ -2036,11 +2066,9 @@ namespace dxvk {
case DxsoOpcode::Crs: { case DxsoOpcode::Crs: {
DxsoRegMask vec3Mask(true, true, true, false); DxsoRegMask vec3Mask(true, true, true, false);
DxsoRegisterValue crossValue; DxsoRegisterValue crossValue = emitCross(
crossValue.type = { DxsoScalarType::Float32, 3 }; emitRegisterLoad(src[0], vec3Mask),
crossValue.id = m_module.opCross(getVectorTypeId(crossValue.type), emitRegisterLoad(src[1], vec3Mask));
emitRegisterLoad(src[0], vec3Mask).id,
emitRegisterLoad(src[1], vec3Mask).id);
std::array<uint32_t, 3> indices = { 0, 0, 0 }; std::array<uint32_t, 3> indices = { 0, 0, 0 };

View File

@ -562,6 +562,10 @@ namespace dxvk {
DxsoRegisterValue a, DxsoRegisterValue a,
DxsoRegisterValue b); DxsoRegisterValue b);
DxsoRegisterValue emitCross(
DxsoRegisterValue a,
DxsoRegisterValue b);
DxsoRegisterValue emitRegisterInsert( DxsoRegisterValue emitRegisterInsert(
DxsoRegisterValue dstValue, DxsoRegisterValue dstValue,
DxsoRegisterValue srcValue, DxsoRegisterValue srcValue,