From 89c781ae834856bad75283a96a2b3a776385bf55 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Sun, 6 Sep 2026 04:29:02 -0400 Subject: [PATCH] Another tests on phi --- src/shader_recompiler/ir_opt/texture_pass.cpp | 56 +++++++++++-------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp index 07f279c530..e04163a385 100644 --- a/src/shader_recompiler/ir_opt/texture_pass.cpp +++ b/src/shader_recompiler/ir_opt/texture_pass.cpp @@ -299,18 +299,30 @@ static inline bool IsTexturePixelFormatIntegerCached(Environment& env, } -std::optional Track(const IR::Value& value, Environment& env, const HostTranslateInfo& host_info); -static inline std::optional TrackCached(const IR::Value& v, Environment& env, const HostTranslateInfo& host_info) { +constexpr size_t PHI_TRACK_MAX_DEPTH = 3; + +struct PhiTrackState { + boost::container::small_vector active; + size_t depth{}; +}; + +std::optional Track(const IR::Value& value, Environment& env, + const HostTranslateInfo& host_info, PhiTrackState& state); +static inline std::optional TrackCached(const IR::Value& v, Environment& env, + const HostTranslateInfo& host_info, + PhiTrackState& state) { if (const IR::Inst* key = v.InstRecursive()) { if (auto it = env.track_cache.find(key); it != env.track_cache.end()) return it->second; - auto found = Track(v, env, host_info); + auto found = Track(v, env, host_info, state); if (found) env.track_cache.emplace(key, *found); return found; } - return Track(v, env, host_info); + return Track(v, env, host_info, state); } -std::optional TryGetConstBuffer(const IR::Inst* inst, Environment& env, const HostTranslateInfo& host_info); +std::optional TryGetConstBuffer(const IR::Inst* inst, Environment& env, + const HostTranslateInfo& host_info, + PhiTrackState& state); bool IsSameConstBufferAddr(const ConstBufferAddr& lhs, const ConstBufferAddr& rhs) { return lhs.index == rhs.index && lhs.offset == rhs.offset && @@ -320,13 +332,6 @@ bool IsSameConstBufferAddr(const ConstBufferAddr& lhs, const ConstBufferAddr& rh lhs.has_secondary == rhs.has_secondary && lhs.dynamic_offset == rhs.dynamic_offset; } -constexpr size_t PHI_TRACK_MAX_DEPTH = 4; - -struct PhiTrackState { - boost::container::small_vector active; - size_t depth{}; -}; - std::optional TrackUncached(const IR::Value& value, Environment& env, const HostTranslateInfo& host_info, PhiTrackState& state, bool& ambiguous); @@ -396,18 +401,19 @@ std::optional TrackUncached(const IR::Value& value, Environment if (inst->GetOpcode() == IR::Opcode::Phi) { return TrackPhi(inst, env, host_info, state, ambiguous); } - return TryGetConstBuffer(inst, env, host_info); + return TryGetConstBuffer(inst, env, host_info, state); }); } -std::optional Track(const IR::Value& value, Environment& env, const HostTranslateInfo& host_info) { +std::optional Track(const IR::Value& value, Environment& env, + const HostTranslateInfo& host_info, PhiTrackState& state) { if (!Settings::values.enable_shader_phi_tracking.GetValue()) { return IR::BreadthFirstSearch( - value, [&env, &host_info](const IR::Inst* inst) -> std::optional { - return TryGetConstBuffer(inst, env, host_info); + value, [&env, &host_info, &state]( + const IR::Inst* inst) -> std::optional { + return TryGetConstBuffer(inst, env, host_info, state); }); } - PhiTrackState state; bool ambiguous = false; const std::optional result{ TrackUncached(value, env, host_info, state, ambiguous)}; @@ -438,13 +444,15 @@ std::optional TryGetConstant(IR::Value& value, Environment& env) { return ReadCbufCached(env, index_number, offset_number); } -std::optional TryGetConstBuffer(const IR::Inst* inst, Environment& env, const HostTranslateInfo& host_info) { +std::optional TryGetConstBuffer(const IR::Inst* inst, Environment& env, + const HostTranslateInfo& host_info, + PhiTrackState& state) { switch (inst->GetOpcode()) { default: return std::nullopt; case IR::Opcode::BitwiseOr32: { - std::optional lhs{TrackCached(inst->Arg(0), env, host_info)}; - std::optional rhs{TrackCached(inst->Arg(1), env, host_info)}; + std::optional lhs{TrackCached(inst->Arg(0), env, host_info, state)}; + std::optional rhs{TrackCached(inst->Arg(1), env, host_info, state)}; if (!lhs || !rhs) { return std::nullopt; } @@ -474,7 +482,7 @@ std::optional TryGetConstBuffer(const IR::Inst* inst, Environme if (!shift.IsImmediate()) { return std::nullopt; } - std::optional lhs{TrackCached(inst->Arg(0), env, host_info)}; + std::optional lhs{TrackCached(inst->Arg(0), env, host_info, state)}; if (lhs) { lhs->shift_left = shift.U32(); } @@ -502,7 +510,7 @@ std::optional TryGetConstBuffer(const IR::Inst* inst, Environme return std::nullopt; } while (false); } - std::optional lhs{TrackCached(op1, env, host_info)}; + std::optional lhs{TrackCached(op1, env, host_info, state)}; if (lhs) { lhs->shift_left = static_cast(std::countr_zero(op2.U32())); } @@ -568,7 +576,9 @@ std::optional TryGetConstBuffer(const IR::Inst* inst, Environme TextureInst MakeInst(Environment& env, IR::Block* block, IR::Inst& inst, const HostTranslateInfo& host_info) { ConstBufferAddr addr; if (IsBindless(inst)) { - const std::optional track_addr{TrackCached(inst.Arg(0), env, host_info)}; + PhiTrackState state; + const std::optional track_addr{ + TrackCached(inst.Arg(0), env, host_info, state)}; if (!track_addr) { throw NotImplementedException("Failed to track bindless texture constant buffer");