This commit is contained in:
mahmoud radwan
2025-04-28 12:41:40 +03:00
parent 516b1af905
commit 85c3d78815
2 changed files with 6 additions and 3 deletions

View File

@@ -206,7 +206,8 @@ static void LowerBufferFormatInst(IR::Block& block, IR::Inst& inst, Info& info)
.swizzle = is_inst_typed .swizzle = is_inst_typed
? AmdGpu::RemapSwizzle(flags.inst_data_fmt.Value(), AmdGpu::IdentityMapping) ? AmdGpu::RemapSwizzle(flags.inst_data_fmt.Value(), AmdGpu::IdentityMapping)
: buffer.DstSelect(), : buffer.DstSelect(),
.num_conversion = is_inst_typed ? AmdGpu::MapNumberConversion(flags.inst_num_fmt.Value(), flags.inst_data_fmt.Value()) .num_conversion = is_inst_typed
? AmdGpu::MapNumberConversion(flags.inst_num_fmt.Value(), flags.inst_data_fmt.Value())
: buffer.GetNumberConversion(), : buffer.GetNumberConversion(),
.num_components = AmdGpu::NumComponents(data_format), .num_components = AmdGpu::NumComponents(data_format),
}; };

View File

@@ -84,13 +84,15 @@ inline F32 ApplyWriteNumberConversion(IREmitter& ir, const F32& value,
const IR::F32 max = ir.Imm32(float(std::numeric_limits<u8>::max())); const IR::F32 max = ir.Imm32(float(std::numeric_limits<u8>::max()));
const IR::F32 mul = ir.FPMul(ir.FPClamp(value, ir.Imm32(-1.f), ir.Imm32(1.f)), max); const IR::F32 mul = ir.FPMul(ir.FPClamp(value, ir.Imm32(-1.f), ir.Imm32(1.f)), max);
const IR::F32 left = ir.FPSub(mul, ir.Imm32(1.f)); const IR::F32 left = ir.FPSub(mul, ir.Imm32(1.f));
return ir.BitCast<F32>(U32{ir.FPDiv(left, ir.Imm32(2.f))}); const IR::U32 raw = ir.ConvertFToS(32, ir.FPDiv(left, ir.Imm32(2.f)));
return ir.BitCast<F32>(raw);
} }
case AmdGpu::NumberConversion::Sint16ToSnormNz: { case AmdGpu::NumberConversion::Sint16ToSnormNz: {
const IR::F32 max = ir.Imm32(float(std::numeric_limits<u16>::max())); const IR::F32 max = ir.Imm32(float(std::numeric_limits<u16>::max()));
const IR::F32 mul = ir.FPMul(ir.FPClamp(value, ir.Imm32(-1.f), ir.Imm32(1.f)), max); const IR::F32 mul = ir.FPMul(ir.FPClamp(value, ir.Imm32(-1.f), ir.Imm32(1.f)), max);
const IR::F32 left = ir.FPSub(mul, ir.Imm32(1.f)); const IR::F32 left = ir.FPSub(mul, ir.Imm32(1.f));
return ir.BitCast<F32>(U32{ir.FPDiv(left, ir.Imm32(2.f))}); const IR::U32 raw = ir.ConvertFToS(32, ir.FPDiv(left, ir.Imm32(2.f)));
return ir.BitCast<F32>(raw);
} }
default: default:
UNREACHABLE(); UNREACHABLE();