From c29aada46a4b77a98fd8cc6a56de10b9a36e9a9b Mon Sep 17 00:00:00 2001 From: Ivan Chikish Date: Fri, 28 Jul 2023 15:08:32 +0300 Subject: [PATCH] Fragment: V3_{MIN|MAX|MIN3|RSQ}_F32 --- hw/amdgpu/shader/src/Fragment.cpp | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/hw/amdgpu/shader/src/Fragment.cpp b/hw/amdgpu/shader/src/Fragment.cpp index 75dbb778e..958326971 100644 --- a/hw/amdgpu/shader/src/Fragment.cpp +++ b/hw/amdgpu/shader/src/Fragment.cpp @@ -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( + fragment.getScalarOperand(inst.src0, TypeId::Float32).value); + auto src1 = spirv::cast( + 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( 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( + fragment.getScalarOperand(inst.src0, TypeId::Float32).value); + auto src1 = spirv::cast( + 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( + fragment.getScalarOperand(inst.src0, TypeId::Float32).value); + auto src1 = spirv::cast( + fragment.getScalarOperand(inst.src1, TypeId::Float32).value); + auto src2 = spirv::cast( + 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( 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( + 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();