mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-12-12 14:48:52 +00:00
shader_recompiler: Implement ff1 with subgroup ops (#3225)
This commit is contained in:
@@ -660,6 +660,14 @@ U32 IREmitter::WriteLane(const U32& value, const U32& write_value, const U32& la
|
||||
return Inst<U32>(Opcode::WriteLane, value, write_value, lane);
|
||||
}
|
||||
|
||||
Value IREmitter::Ballot(const U1& bit) {
|
||||
return Inst(Opcode::Ballot, bit);
|
||||
}
|
||||
|
||||
U32 IREmitter::BallotFindLsb(const Value& mask) {
|
||||
return Inst<U32>(Opcode::BallotFindLsb, mask);
|
||||
}
|
||||
|
||||
F32F64 IREmitter::FPAdd(const F32F64& a, const F32F64& b) {
|
||||
if (a.Type() != b.Type()) {
|
||||
UNREACHABLE_MSG("Mismatching types {} and {}", a.Type(), b.Type());
|
||||
|
||||
@@ -176,6 +176,8 @@ public:
|
||||
[[nodiscard]] U32 ReadFirstLane(const U32& value);
|
||||
[[nodiscard]] U32 ReadLane(const U32& value, const U32& lane);
|
||||
[[nodiscard]] U32 WriteLane(const U32& value, const U32& write_value, const U32& lane);
|
||||
[[nodiscard]] Value Ballot(const U1& bit);
|
||||
[[nodiscard]] U32 BallotFindLsb(const Value& mask);
|
||||
|
||||
[[nodiscard]] Value CompositeConstruct(const Value& e1, const Value& e2);
|
||||
[[nodiscard]] Value CompositeConstruct(const Value& e1, const Value& e2, const Value& e3);
|
||||
|
||||
@@ -472,5 +472,7 @@ OPCODE(QuadShuffle, U32, U32,
|
||||
OPCODE(ReadFirstLane, U32, U32, )
|
||||
OPCODE(ReadLane, U32, U32, U32 )
|
||||
OPCODE(WriteLane, U32, U32, U32, U32 )
|
||||
OPCODE(Ballot, U32x4, U1, )
|
||||
OPCODE(BallotFindLsb, U32, U32x4, )
|
||||
OPCODE(DataAppend, U32, U32, U32 )
|
||||
OPCODE(DataConsume, U32, U32, U32 )
|
||||
|
||||
@@ -95,17 +95,7 @@ void ReadLaneEliminationPass(IR::Program& program) {
|
||||
if (inst.GetOpcode() != IR::Opcode::ReadLane) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check for the following pattern and replace it with ReadFirstLane
|
||||
// s_ff1_i32_b64 sgpr, exec
|
||||
// v_readlane_b32 sdst, vgpr, sgpr
|
||||
if (const auto lane = inst.Arg(1); !lane.IsImmediate()) {
|
||||
if (lane.InstRecursive()->GetOpcode() == IR::Opcode::FindILsb64) {
|
||||
const auto value = inst.Arg(0);
|
||||
inst.ReplaceOpcode(IR::Opcode::ReadFirstLane);
|
||||
inst.ClearArgs();
|
||||
inst.SetArg(0, value);
|
||||
}
|
||||
if (!inst.Arg(1).IsImmediate()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user