From 32a9febee4f424c18ef83979f79d187c1304a212 Mon Sep 17 00:00:00 2001 From: DH Date: Sun, 30 Jul 2023 19:35:39 +0300 Subject: [PATCH] [amdgpu] shader: implement vop3 V_MED3_F32 --- hw/amdgpu/shader/src/Fragment.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/hw/amdgpu/shader/src/Fragment.cpp b/hw/amdgpu/shader/src/Fragment.cpp index ec4b8c6ca..9639775d4 100644 --- a/hw/amdgpu/shader/src/Fragment.cpp +++ b/hw/amdgpu/shader/src/Fragment.cpp @@ -2770,6 +2770,33 @@ void convertVop3(Fragment &fragment, Vop3 inst) { fragment.setVectorOperand(inst.vdst, {floatT, result}); break; } + + case Vop3::Op::V3_MED3_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 boolT = fragment.context->getBoolType(); + auto floatT = fragment.context->getFloat32Type(); + auto glslStd450 = fragment.context->getGlslStd450(); + + auto min01 = fragment.builder.createSelect( + floatT, fragment.builder.createFOrdLessThan(boolT, src0, src1), src0, + src1); + auto max01 = fragment.builder.createSelect( + floatT, fragment.builder.createFOrdGreaterThan(boolT, src0, src1), src0, + src1); + auto minMax011 = fragment.builder.createSelect( + floatT, fragment.builder.createFOrdLessThan(boolT, max01, src2), max01, + src2); + + auto result = fragment.builder.createExtInst( + floatT, glslStd450, GLSLstd450NMax, {{min01, minMax011}}); + + fragment.setVectorOperand(inst.vdst, {floatT, result}); + } case Vop3::Op::V3_FMA_F32: { auto src0 = spirv::cast( fragment.getScalarOperand(inst.src0, TypeId::Float32).value);