mirror of
https://github.com/RPCSX/rpcsx.git
synced 2025-12-06 07:12:14 +01:00
Fragment: V3_{MIN|MAX|MIN3|RSQ}_F32
This commit is contained in:
parent
6b0db73ecd
commit
c29aada46a
|
|
@ -2682,6 +2682,22 @@ void convertVop3(Fragment &fragment, Vop3 inst) {
|
|||
fragment.setVectorOperand(inst.vdst, {floatT, result});
|
||||
break;
|
||||
}
|
||||
case Vop3::Op::V3_MAX_F32: {
|
||||
auto src0 = spirv::cast<spirv::FloatValue>(
|
||||
fragment.getScalarOperand(inst.src0, TypeId::Float32).value);
|
||||
auto src1 = spirv::cast<spirv::FloatValue>(
|
||||
fragment.getScalarOperand(inst.src1, TypeId::Float32).value);
|
||||
|
||||
auto floatT = fragment.context->getFloat32Type();
|
||||
auto boolT = fragment.context->getBoolType();
|
||||
|
||||
auto result = fragment.builder.createSelect(
|
||||
floatT, fragment.builder.createFOrdGreaterThanEqual(boolT, src0, src1),
|
||||
src0, src1);
|
||||
|
||||
fragment.setVectorOperand(inst.vdst, {floatT, result});
|
||||
break;
|
||||
}
|
||||
case Vop3::Op::V3_MAX3_F32: {
|
||||
auto src0 = spirv::cast<spirv::FloatValue>(
|
||||
fragment.getScalarOperand(inst.src0, TypeId::Float32).value);
|
||||
|
|
@ -2702,6 +2718,42 @@ void convertVop3(Fragment &fragment, Vop3 inst) {
|
|||
fragment.setVectorOperand(inst.vdst, {floatT, result});
|
||||
break;
|
||||
}
|
||||
case Vop3::Op::V3_MIN_F32: {
|
||||
auto src0 = spirv::cast<spirv::FloatValue>(
|
||||
fragment.getScalarOperand(inst.src0, TypeId::Float32).value);
|
||||
auto src1 = spirv::cast<spirv::FloatValue>(
|
||||
fragment.getScalarOperand(inst.src1, TypeId::Float32).value);
|
||||
|
||||
auto floatT = fragment.context->getFloat32Type();
|
||||
auto boolT = fragment.context->getBoolType();
|
||||
|
||||
auto result = fragment.builder.createSelect(
|
||||
floatT, fragment.builder.createFOrdLessThan(boolT, src0, src1), src0,
|
||||
src1);
|
||||
|
||||
fragment.setVectorOperand(inst.vdst, {floatT, result});
|
||||
break;
|
||||
}
|
||||
case Vop3::Op::V3_MIN3_F32: {
|
||||
auto src0 = spirv::cast<spirv::FloatValue>(
|
||||
fragment.getScalarOperand(inst.src0, TypeId::Float32).value);
|
||||
auto src1 = spirv::cast<spirv::FloatValue>(
|
||||
fragment.getScalarOperand(inst.src1, TypeId::Float32).value);
|
||||
auto src2 = spirv::cast<spirv::FloatValue>(
|
||||
fragment.getScalarOperand(inst.src2, TypeId::Float32).value);
|
||||
auto floatT = fragment.context->getFloat32Type();
|
||||
auto boolT = fragment.context->getBoolType();
|
||||
|
||||
auto min01 = fragment.builder.createSelect(
|
||||
floatT, fragment.builder.createFOrdLessThan(boolT, src0, src1), src0,
|
||||
src1);
|
||||
auto result = fragment.builder.createSelect(
|
||||
floatT, fragment.builder.createFOrdLessThan(boolT, min01, src2), min01,
|
||||
src2);
|
||||
|
||||
fragment.setVectorOperand(inst.vdst, {floatT, result});
|
||||
break;
|
||||
}
|
||||
case Vop3::Op::V3_FMA_F32: {
|
||||
auto src0 = spirv::cast<spirv::FloatValue>(
|
||||
fragment.getScalarOperand(inst.src0, TypeId::Float32).value);
|
||||
|
|
@ -2804,6 +2856,18 @@ void convertVop3(Fragment &fragment, Vop3 inst) {
|
|||
fragment.setVectorOperand(inst.vdst, {uint32T, result});
|
||||
break;
|
||||
}
|
||||
case Vop3::Op::V3_RSQ_F32: {
|
||||
auto src = spirv::cast<spirv::FloatValue>(
|
||||
fragment.getScalarOperand(inst.src0, TypeId::Float32).value);
|
||||
auto floatT = fragment.context->getFloat32Type();
|
||||
|
||||
auto glslStd450 = fragment.context->getGlslStd450();
|
||||
auto result = fragment.builder.createExtInst(
|
||||
floatT, glslStd450, GLSLstd450InverseSqrt, {{src}});
|
||||
|
||||
fragment.setVectorOperand(inst.vdst, {floatT, result});
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
inst.dump();
|
||||
|
|
|
|||
Loading…
Reference in a new issue