mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-31 22:44:41 +00:00
my stupid ass messed all while trying to resolve the conflicts..
This commit is contained in:
parent
0bbc095cd1
commit
d998a72dcd
@ -206,7 +206,7 @@ static void LowerBufferFormatInst(IR::Block& block, IR::Inst& inst, Info& info)
|
||||
.swizzle = is_inst_typed
|
||||
? AmdGpu::RemapSwizzle(flags.inst_data_fmt.Value(), AmdGpu::IdentityMapping)
|
||||
: buffer.DstSelect(),
|
||||
.num_conversion = is_inst_typed ? AmdGpu::MapNumberConversion(flags.inst_num_fmt.Value())
|
||||
.num_conversion = is_inst_typed ? AmdGpu::MapNumberConversion(flags.inst_num_fmt.Value(), flags.inst_data_fmt.Value())
|
||||
: buffer.GetNumberConversion(),
|
||||
.num_components = AmdGpu::NumComponents(data_format),
|
||||
};
|
||||
|
@ -34,6 +34,22 @@ inline F32 ApplyReadNumberConversion(IREmitter& ir, const F32& value,
|
||||
case AmdGpu::NumberConversion::UnormToUbnorm:
|
||||
// Convert 0...1 to -1...1
|
||||
return ir.FPSub(ir.FPMul(value, ir.Imm32(2.f)), ir.Imm32(1.f));
|
||||
case AmdGpu::NumberConversion::Sint8ToSnormNz: {
|
||||
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 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: {
|
||||
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 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:
|
||||
UNREACHABLE();
|
||||
}
|
||||
@ -66,6 +82,18 @@ inline F32 ApplyWriteNumberConversion(IREmitter& ir, const F32& value,
|
||||
case AmdGpu::NumberConversion::UnormToUbnorm:
|
||||
// Convert -1...1 to 0...1
|
||||
return ir.FPDiv(ir.FPAdd(value, ir.Imm32(1.f)), ir.Imm32(2.f));
|
||||
case AmdGpu::NumberConversion::Sint8ToSnormNz: {
|
||||
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 left = ir.FPSub(mul, ir.Imm32(1.f));
|
||||
return ir.BitCast<F32>(U32{ir.FPDiv(left, ir.Imm32(2.f))});
|
||||
}
|
||||
case AmdGpu::NumberConversion::Sint16ToSnormNz: {
|
||||
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 left = ir.FPSub(mul, ir.Imm32(1.f));
|
||||
return ir.BitCast<F32>(U32{ir.FPDiv(left, ir.Imm32(2.f))});
|
||||
}
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
@ -932,7 +932,7 @@ struct Liverpool {
|
||||
}
|
||||
|
||||
[[nodiscard]] NumberConversion GetNumberConversion() const {
|
||||
return MapNumberConversion(info.number_type);
|
||||
return MapNumberConversion(info.number_type, info.format);
|
||||
}
|
||||
|
||||
[[nodiscard]] CompMapping Swizzle() const {
|
||||
|
@ -68,7 +68,7 @@ struct Buffer {
|
||||
}
|
||||
|
||||
NumberConversion GetNumberConversion() const noexcept {
|
||||
return MapNumberConversion(NumberFormat(num_format));
|
||||
return MapNumberConversion(NumberFormat(num_format), DataFormat(data_format));
|
||||
}
|
||||
|
||||
u32 GetStride() const noexcept {
|
||||
@ -292,7 +292,7 @@ struct Image {
|
||||
}
|
||||
|
||||
NumberConversion GetNumberConversion() const noexcept {
|
||||
return MapNumberConversion(NumberFormat(num_format));
|
||||
return MapNumberConversion(NumberFormat(num_format), DataFormat(data_format));
|
||||
}
|
||||
|
||||
TilingMode GetTilingMode() const {
|
||||
|
@ -359,7 +359,6 @@ inline NumberConversion MapNumberConversion(const NumberFormat num_fmt, const Da
|
||||
return NumberConversion::Sint16ToSnormNz;
|
||||
default:
|
||||
UNREACHABLE_MSG("data_fmt = {}", u32(data_fmt));
|
||||
break;
|
||||
}
|
||||
}
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user